场论与复变函数大作业.doc

上传人:jian****018 文档编号:8812178 上传时间:2020-04-01 格式:DOC 页数:25 大小:911KB
返回 下载 相关 举报
场论与复变函数大作业.doc_第1页
第1页 / 共25页
场论与复变函数大作业.doc_第2页
第2页 / 共25页
场论与复变函数大作业.doc_第3页
第3页 / 共25页
点击查看更多>>
资源描述
场论与复变函数大作业问题1问题I描述在圆环内一点(x0,y0)处有一条光线射出圆环半径为R推导该光线经过m次反射后方向的公式伴随(x0,y0)的不同,分析按照相同方向射出的光线反射方向有什么特点?给定(x0,y0),分析按照不同方向射出的光线反射方向有什么特点?分析:给定起始点(x,y),反射角angle,反射次数n根据(x,y),angle可以计算出入射光线在圆周上的两个(x0,yo)(x1,y1)。计算方法如下:double k=tan(angle);double x1,y1;/设出弦长中点的坐标,辅助求解交点double length;/反射弦长的一半x1 = k * (k * x0 - y0) / (k * k +1);y1 = -(k * x0 - y0) / (k * k +1);length = (double)sqrt( (double) (R*R - x1 * x1 - y1 * y1) );pnode0.x = x1 - length * cos(angle);pnode0.y = y1 - length * sin(angle);pnode1.x = x1 + length * cos(angle);pnode1.y = y1 + length * sin(angle);然后由(x0,y0)(x1,y1)可得出(x2,y2);同理由(xi,yi)(xi-1,yi-1)可求出(xi+1,yi+1),依次即可求出所有反射点实现方法:pnodei+1.x = 2 * (pnodei.x) * ( (pnodei-1.x) * (pnodei.x) + (pnodei-1.y) * (pnodei.y) ) - (pnodei-1.x);pnodei+1.y = 2 * (pnodei.y) * ( (pnodei-1.x) * (pnodei.x) + (pnodei-1.y) * (pnodei.y) ) - (pnodei-1.y);用C语言编写代码运行结果如下:翻译成MATLAB语言,作图效果:结论伴随(x0,y0)的不同,分析按照相同方向射出的光线反射方向有什么特点?取(0.5,0.3)为发射点,角度分别用45,60,75反射25次作图比较给定(x0,y0),分析按照不同方向射出的光线反射方向有什么特点?确定入射角为62,反射25次。入射点依次取(-0.5,0.3)(0,0.3)(0.5,0.3)附C程序代码/* 复变函数大作业程序(一)姓名:运世洁02103094日期:2011.11.27*/#include #include #include #define R 1/圆的半径备注:修改时,注意改变后面printf函数输出时的格式typedef struct pnode/一个点的坐标double x;double y;Coordinate;Coordinate pnode100=0,0;/储存各反射点坐标/子函数声明*void my_func(int i);/主要功能函数,计算各反射点void my_init(double x0, double y0, double angle);/初始化条件void lieju(int start,int end);/输出第start到第end次反射过程/主函数*void main()int i,n,start,end;char input_flag=1,flag=0;double angle,x0,y0;while(input_flag)printf(请依次输入起始点坐标x0,y0,入射角angle(-180,180,反射次数nn格式:x0,y0,angle,n 圆半径为%dn,R);/注意R的输出格式scanf(%lf,%lf,%lf,%d,&x0,&y0,&angle,&n);if(x0*x0+y0*y0R*R)&(-180angle)&(angle0)input_flag=0;elseprintf(输入错误,请重新输入n);my_init(x0, y0,angle);/初始化for(i=1;i (%lf,%lf) n,n,pnoden.x,pnoden.y,pnoden+1.x,pnoden+1.y);printf(请问是否需要反射详细过程Y/N(退出)? n);while(flag!=Y&flag!=y&flag!=N&flag!=n)flag=getch();if(flag=Y|flag=y)input_flag=1;while(input_flag)printf(请输入需要的过程:0startend=n n格式:start,endn备注:预留0,0输入为退出标志 n);scanf(%d,%d,&start,&end);if(0start&startend&end=n)input_flag=0;else if(end=0&start=0)break;else printf(输入错误,请重新输入 n);if(input_flag=0)lieju(start,end);printf(按任意键退出);getch();/*子函数名称:my_init功能:初始化条件,为后续计算各点坐标提供初始条件pnode0,pnode1输入参数:入射点坐标:double x0, double y0入射角: double angle返回值:void备注:各公式推导,附word文档*/void my_init(double x0, double y0, double angle)if(angle=90)pnode0.x=pnode1.x=x0;pnode0.y=-sqrt(R*R-x0*x0);pnode1.y=sqrt(R*R-x0*x0);else if(angle=-90)pnode0.x=pnode1.x=x0;pnode0.y=sqrt(R*R-x0*x0);pnode1.y=-sqrt(R*R-x0*x0);else if(angle=0)pnode0.y=pnode1.y=y0;pnode0.x=-sqrt(R*R-y0*y0);pnode1.x=sqrt(R*R-y0*y0);else if(angle=180)pnode0.y=pnode1.y=y0;pnode0.x=sqrt(R*R-y0*y0);pnode1.x=-sqrt(R*R-y0*y0);elsedouble k=tan(angle);double x1,y1;/设出弦长中点的坐标,辅助求解交点double length;/反射弦长的一半x1 = k * (k * x0 - y0) / (k * k +1);y1 = -(k * x0 - y0) / (k * k +1);length = (double)sqrt( (double) (R*R - x1 * x1 - y1 * y1) );pnode0.x = x1 - length * cos(angle);pnode0.y = y1 - length * sin(angle);pnode1.x = x1 + length * cos(angle);pnode1.y = y1 + length * sin(angle);/*名称:my_func功能:根据初始化计算出来的pnode0,pnode1计算以后各反射点坐标输入参数:int i(第i次反射)返回值:void*/void my_func(int i)pnodei+1.x = 2 * (pnodei.x) * ( (pnodei-1.x) * (pnodei.x) + (pnodei-1.y) * (pnodei.y) ) - (pnodei-1.x);pnodei+1.y = 2 * (pnodei.y) * ( (pnodei-1.x) * (pnodei.x) + (pnodei-1.y) * (pnodei.y) ) - (pnodei-1.y);/*名称:lieju功能:根据用户需要,列举中间过程输入参数:开始int start,结束int end返回值:void*/void lieju(int start,int end)int k;for(k=start;k (%lf,%lf) n,k,pnodek.x,pnodek.y,pnodek+1.x,pnodek+1.y);附matlab程序代码%假设圆的半径为1display(请输入入射的坐标:);x=input(X:);y=input(Y:);display(请输入入射角度);degree=input(角度);degree=mod(degree,360);%初始化if degree=0 end_y=y; start_y=end_y; start_x=-sqrt(1-y2); end_x=-start_x;elseif degree=180 start_y=y; end_y=y; start_x=sqrt(1-y2); end_x=-start_x;elseif degree=90 end_x=x; start_x-x; start_y=-sqrt(1-x2); end_y=-start_y;elseif degree=270 start_x=x; end_x=x; start_y=sqrt(1-x2); end_y=-start_y;else degree=degree*pi/180; k=tan(degree); x1=k*(k*x-y)/(k*k+1); y1=-(k*x-y)/(k*k+1); len=sqrt(1-x12-y12); start_x=x1-len*cos(degree); start_y=y1-len*sin(degree); end_x=x1+len*cos(degree); end_y=y1+len*sin(degree);endx_temp=x:(end_x-x)/200:end_x;y_temp=y:(end_y-y)/200:end_y;%开始反射m=input(请输入反射的次数);cla resetfigure(1);ezplot(x2+y2=1);hold on;plot(x,y,*);hold on;plot(x_temp,y_temp,r);hold on;i=1;while i=m i=i+1; x=2*end_x*(start_x*end_x+start_y*end_y)-start_x; y=2*end_y*(start_x*end_x+start_y*end_y)-start_y; start_x=end_x; start_y=end_y; end_x=x; end_y=y; x_temp=start_x:(end_x-start_x)/200:end_x; y_temp=start_y:(end_y-start_y)/200:end_y; plot(x_temp,y_temp,r); hold on;endplot(end_x,end_y,*);axis(-1 1 -1 1);%调整x轴y轴坐标范围axis square; %使x轴y轴等长 grid on;clear;问题2问题I描述在圆柱口面上一点(x0 ,y0 ,z0 )处有一条光线射入圆柱半径为R,长H推导该光线反射回口面的位置及方向公式伴随入射点位置不同分析反射波有什么特点?伴随入射点方向不同分析反射波有什么特点?伴随H/R比值不同分析反射波有什么特点?分析可以吧入射速度分解成z轴方向上的和xoy平面内的分量在平面上可以利用问题1中的函数求解平面上的反射在Z轴方向上,让光线走2L长度即可用C语言编写代码运行结果翻译成matlab语言,做出射点的投影图当入射点xoy平面的投影点为(0,0)角度b(入射方向与圆柱两底的夹角)保持不变角度a(入射方向在平面上投影与x轴的夹角)从0到2变化得到的图像为一圆,即此时出射点落在该圆上当入射点xoy平面的投影点为(0,0)角度b(入射方向与圆柱两底的夹角)从0到变化角度a(入射方向在平面上投影与x轴的夹角)保持不变得到一条过原点的直线当a,b均改变时得到几个圆域,有图分析可知,出射点均落在这些圆上结论由上述所知,当入射点投影为(0,0)时,出射点落在几个半径不同的半圆域上(见上图)伴随入射点位置不同分析反射波有什么特点?当入射点投影为(0.3,0.5)时(这个出射点投影域是什么东西!?两个外星人么?)分开看角度b(入射方向与圆柱两底的夹角)保持不变角度a(入射方向在平面上投影与x轴的夹角)从0到2变化各种像这样的轴对称图形,没发现其他明显规律角度b(入射方向与圆柱两底的夹角)从0到变化角度a(入射方向在平面上投影与x轴的夹角)保持不变这个大约可以看出是几个箭头行组成的区域把间隔调到最密,程序运行N久后。大约可以看出出射点在圆域的某一侧分布比较密集,另一次较稀疏分布为轴对称式伴随入射点方向不同分析反射波有什么特点?为分析简单,拿(0,0)点作为定点从上面关于(0,0)点的3个截图中可以看出角度a(入射方向在平面上投影与x轴的夹角)从0到2变化时随a的增大,出射点与入射点连线与轴夹角不断边打切范围为(0,)或(-,0)之一,具体域吧取值有关 角度b(入射方向与圆柱两底的夹角)从0到变化是随b增大,出射点域偏离入射点域越来越远附C程序代码/* 复变函数大作业程序(二)姓名:运世洁02103094日期:2011.11.27*/#include #include #include #define R 1/圆的半径备注:修改时,注意改变后面printf函数输出时的格式typedef struct pnode/一个点的3维坐标double x;double y;double z;Coordinate;Coordinate pnode100=0,0,0;/储存各反射点坐标/子函数声明*int my_func(double deep,double r_length,double v_x,double v_y,double v_z);/主要功能函数,计算各反射点,并返回总反射次数int my_init(double x0, double y0, double v_x,double v_y);/初始化条件,并返回反射弦长void lieju(int start,int end);/输出第start到第end次反射过程/主函数*void main()int i,n,start,end;char input_flag=1,flag=0;double angle,x0,y0,v_x,v_y,v_z,deep;double r_length;/反射在xoy平面的弦长while(input_flag)printf(请以此输入入射点在xoy平面内的投影坐标x0,y0,圆柱筒长度deep,n入射速度V沿x轴,y轴,z轴方向上的分量v_x,v_y,v_z(0)n);printf(输入格式:x0,y0,length,v_x,v_y,v_z圆柱筒半径为%dn,R);/坐标建立方式:以圆柱筒底面所在平面为xoy坐标面scanf(%lf,%lf,%lf,%lf,%lf,%lf,&x0,&y0,&deep,&v_x,&v_y,&v_z);if(x0*x0+y0*y00&v_z0)input_flag=0;elseprintf(输入错误,请重新输入n);pnode0.z=deep;r_length=my_init(x0, y0, v_x,v_y);n=my_func(deep,r_length,v_x,v_y,v_z);pnode0.x=x0;pnode0.y=y0;pnode0.z=deep;printf(经过%d次反射出射点坐标为(%lf,%lf,%lf),方向为(%lf,%lf,%lf)-(%lf,%lf,%lf)n,n,pnoden+1.x,pnoden+1.y,pnoden+1.z,pnoden.x,pnoden.y,pnoden.z,pnoden+1.x,pnoden+1.y,pnoden+1.z); printf(请问是否需要反射详细过程Y/N(退出)? n);while(flag!=Y&flag!=y&flag!=N&flag!=n)flag=getch();if(flag=Y|flag=y)input_flag=1;while(input_flag)printf(请输入需要的过程:0startend=%d n格式:start,endn备注:预留0,0输入为退出标志 n,n);scanf(%d,%d,&start,&end);if(0start&startend&end0)pnode0.x=pnode1.x=x0;pnode0.y=-sqrt(R*R-x0*x0);pnode1.y=sqrt(R*R-x0*x0);length=2*pnode1.y;else if(v_x=0&v_y0&v_y=0)pnode0.y=pnode1.y=y0;pnode0.x=-sqrt(R*R-y0*y0);pnode1.x=sqrt(R*R-y0*y0);length=2*pnode1.x;else if(v_x0)pnodei.x = 2 * (pnodei-1.x) * ( (pnodei-2.x) * (pnodei-1.x) + (pnodei-2.y) * (pnodei-1.y) ) - (pnodei-2.x);pnodei.y = 2 * (pnodei-1.y) * ( (pnodei-2.x) * (pnodei-1.x) + (pnodei-2.y) * (pnodei-1.y) ) - (pnodei-2.y);pnodei.z=z;z=z+v_z*(r_length/v_xoy);i+;/需要加入底面反射点z=-z;/计算底面反射点*太麻烦了也不知道对不对,备注一下*i+;pnodei.x = 2 * (pnodei-2.x) * ( (pnodei-3.x) * (pnodei-2.x) + (pnodei-3.y) * (pnodei-2.y) ) - (pnodei-3.x);pnodei.y = 2 * (pnodei-2.y) * ( (pnodei-3.x) * (pnodei-2.x) + (pnodei-3.y) * (pnodei-2.y) ) - (pnodei-3.y);pnodei.z=z;z=z-v_z*(r_length/v_xoy);pnodei-1.y=(pnodei.z*pnodei-2.y-pnodei-2.z*pnodei.y)/(pnodei.z-pnodei-2.z);pnodei-1.x=(pnodei.z*pnodei-2.x-pnodei-2.z*pnodei.x)/(pnodei.z-pnodei-2.z);pnodei-1.z=0;i+;pnodei.x = 2 * (pnodei-1.x) * ( (pnodei-3.x) * (pnodei-1.x) + (pnodei-3.y) * (pnodei-1.y) ) - (pnodei-3.x);pnodei.y = 2 * (pnodei-1.y) * ( (pnodei-3.x) * (pnodei-1.x) + (pnodei-3.y) * (pnodei-1.y) ) - (pnodei-3.y);pnodei.z=z;z=z-v_z*(r_length/v_xoy);i+;/*while(zdeep)pnodei.x = 2 * (pnodei-1.x) * ( (pnodei-2.x) * (pnodei-1.x) + (pnodei-2.y) * (pnodei-1.y) ) - (pnodei-2.x);pnodei.y = 2 * (pnodei-1.y) * ( (pnodei-2.x) * (pnodei-1.x) + (pnodei-2.y) * (pnodei-1.y) ) - (pnodei-2.y);pnodei.z=z;z=z-v_z*(r_length/v_xoy);i+;pnodei.z=deep;pnodei.x = 2 * (pnodei-1.x) * ( (pnodei-2.x) * (pnodei-1.x) + (pnodei-2.y) * (pnodei-1.y) ) - (pnodei-2.x);pnodei.y = 2 * (pnodei-1.y) * ( (pnodei-2.x) * (pnodei-1.x) + (pnodei-2.y) * (pnodei-1.y) ) - (pnodei-2.y);pnodei.x=pnodei-1.x+(pnodei.x-pnodei-1.x)*(deep-pnodei-1.z)/(-v_z*(r_length/v_xoy);pnodei.y=pnodei-1.y+(pnodei.y-pnodei-1.y)*(deep-pnodei-1.z)/(-v_z*(r_length/v_xoy);i-;return (i);void lieju(int start,int end)int k;for(k=start;k (%lf,%lf,%lf) n,k,pnodek.x,pnodek.y,pnodek.z,pnodek+1.x,pnodek+1.y,pnodek+1.z);附matlab程序代码%*主函数*cla resetfigure(1);ezplot(x2+y2=1);hold on;axis(-1 1 -1 1);%调整x轴y轴坐标范围axis square; %使x轴y轴等长 b=0.1;while(b=pi) a=0; while(a=0,a=0,b=pi%返回反射光线与与入射平面相交点的坐标V_z=abs(sin(b);V_x=abs(cos(b)*cos(a);V_y=abs(cos(b)*sin(a);if V_z=0elseif sin(b)=1 x1=x; y1=y;else %下面进行初始化 if a=0 end_y=y; start_y=end_y; start_x=-sqrt(1-y2); end_x=-start_x; elseif a=pi start_y=y; end_y=y; start_x=sqrt(1-y2); end_x=-start_x; elseif a=pi/2 end_x=x; start_x=x; start_y=-sqrt(1-x2); end_y=-start_y; elseif a=3/2*pi start_x=x; end_x=x; start_y=sqrt(1-x2); end_y=-start_y; else k=tan(a); x1=k*(k*x-y)/(k*k+1); y1=-(k*x-y)/(k*k+1); len=sqrt(1-x12-y12); start_x=x1-len*cos(a); start_y=y1-len*sin(a); end_x=x1+len*cos(a); end_y=y1+len*sin(a); end t=2/V_z; t=t+sqrt(x-start_x)2+(y-start_y)2)/abs(cos(b); %n为反射次数(在底面反射那一次直接无视) n=fix(t*abs(cos(b)/sqrt(end_x-start_x)2+(end_y-start_y)2); %下面是反射n+1次的过程 i=1; while i0 end_y=sqrt(1-end_x2); else end_y=-sqrt(1-end_x2); end end; end k=(t-n*sqrt(end_x-start_x)2+(end_y-start_y)2)/abs(cos(b)/(sqrt(end_x-start_x)2+(end_y-start_y)2)/abs(cos(b); x1=start_x+k*(end_x-start_x); y1=start_y+k*(end_y-start_y);end结束语真心说一句,老师,这个任务太麻烦了,有点超出能力范围了程序由运世洁与马建勋共同调试完成
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!