场论与复变函数大作业.docx
- 文档编号:23987403
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:33
- 大小:825.55KB
场论与复变函数大作业.docx
《场论与复变函数大作业.docx》由会员分享,可在线阅读,更多相关《场论与复变函数大作业.docx(33页珍藏版)》请在冰豆网上搜索。
场论与复变函数大作业
场论与复变函数大作业
问题1
问题I描述
在圆环内一点(x0,y0)处有一条光线射出
圆环半径为R
推导该光线经过m次反射后方向的公式
伴随(x0,y0)的不同,分析按照相同方向射出的光线反射方向有什么特点?
给定(x0,y0),分析按照不同方向射出的光线反射方向有什么特点?
分析:
给定起始点(x,y),反射角angle,反射次数n
根据(x,y),angle可以计算出入射光线在圆周上的两个(x0,yo)(x1,y1)。
计算方法如下:
doublek=tan(angle);
doublex1,y1;//设出弦长中点的坐标,辅助求解交点
doublelength;//反射弦长的一半
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));
pnode[0].x=x1-length*cos(angle);
pnode[0].y=y1-length*sin(angle);
pnode[1].x=x1+length*cos(angle);
pnode[1].y=y1+length*sin(angle);
然后由(x0,y0)(x1,y1)可得出(x2,y2);同理由(xi,yi)(xi-1,yi-1)可求出(xi+1,yi+1),依次即可求出所有反射点
实现方法:
pnode[i+1].x=2*(pnode[i].x)*((pnode[i-1].x)*(pnode[i].x)+(pnode[i-1].y)*(pnode[i].y))-(pnode[i-1].x);
pnode[i+1].y=2*(pnode[i].y)*((pnode[i-1].x)*(pnode[i].x)+(pnode[i-1].y)*(pnode[i].y))-(pnode[i-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
#defineR1//圆的半径备注:
修改时,注意改变后面printf函数输出时的格式
typedefstructpnode//一个点的坐标
{
doublex;
doubley;
}Coordinate;
Coordinatepnode[100]={0,0};//储存各反射点坐标
//子函数声明**********************************************************************************************************************************************
voidmy_func(inti);//主要功能函数,计算各反射点
voidmy_init(doublex0,doubley0,doubleangle);//初始化条件
voidlieju(intstart,intend);//输出第start到第end次反射过程
//主函数*******************************************************************************************************************************************************
voidmain()
{
inti,n,start,end;
charinput_flag=1,flag=0;
doubleangle,x0,y0;
while(input_flag)
{
printf("请依次输入起始点坐标x0,y0,入射角angle(-180,180],反射次数n\n格式:
x0,y0,angle,n圆半径为%d\n",R);//注意R的输出格式
scanf("%lf,%lf,%lf,%d",&x0,&y0,&angle,&n);
if((x0*x0+y0*y0
input_flag=0;
else
printf("输入错误,请重新输入\n");
}
my_init(x0,y0,angle);//初始化
for(i=1;i<=n;i++)
{
my_func(i);
}
printf("经过%d次反射后,此时光线的方向为:
(%lf,%lf)-->(%lf,%lf)\n",n,pnode[n].x,pnode[n].y,pnode[n+1].x,pnode[n+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("请输入需要的过程:
0 start,end\n备注: 预留0,0输入为退出标志\n"); scanf("%d,%d",&start,&end); if(0 input_flag=0; elseif(end==0&&start==0) break; else printf("输入错误,请重新输入\n"); } if(input_flag==0) { lieju(start,end); printf("按任意键退出"); getch(); } } } /********************************************************************************************************************************************************** 子函数 名称: my_init 功能: 初始化条件,为后续计算各点坐标提供初始条件pnode[0],pnode[1] 输入参数: 入射点坐标: doublex0,doubley0入射角: doubleangle 返回值: void 备注: 各公式推导,附word文档 **********************************************************************************************************************************************************/ voidmy_init(doublex0,doubley0,doubleangle) { if(angle==90) { pnode[0].x=pnode[1].x=x0; pnode[0].y=-sqrt(R*R-x0*x0); pnode[1].y=sqrt(R*R-x0*x0); } elseif(angle==-90) { pnode[0].x=pnode[1].x=x0; pnode[0].y=sqrt(R*R-x0*x0); pnode[1].y=-sqrt(R*R-x0*x0); } elseif(angle==0) { pnode[0].y=pnode[1].y=y0; pnode[0].x=-sqrt(R*R-y0*y0); pnode[1].x=sqrt(R*R-y0*y0); } elseif(angle==180) { pnode[0].y=pnode[1].y=y0; pnode[0].x=sqrt(R*R-y0*y0); pnode[1].x=-sqrt(R*R-y0*y0); } else { doublek=tan(angle); doublex1,y1;//设出弦长中点的坐标,辅助求解交点 doublelength;//反射弦长的一半 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)); pnode[0].x=x1-length*cos(angle); pnode[0].y=y1-length*sin(angle); pnode[1].x=x1+length*cos(angle); pnode[1].y=y1+length*sin(angle); } } /********************************************************************************************************************************************************** 名称: my_func 功能: 根据初始化计算出来的pnode[0],pnode[1]计算以后各反射点坐标 输入参数: inti(第i次反射) 返回值: void ***********************************************************************************************************************************************************/ voidmy_func(inti) { pnode[i+1].x=2*(pnode[i].x)*((pnode[i-1].x)*(pnode[i].x)+(pnode[i-1].y)*(pnode[i].y))-(pnode[i-1].x); pnode[i+1].y=2*(pnode[i].y)*((pnode[i-1].x)*(pnode[i].x)+(pnode[i-1].y)*(pnode[i].y))-(pnode[i-1].y); } /********************************************************************************************************************************************************** 名称: lieju 功能: 根据用户需要,列举中间过程 输入参数: 开始intstart,结束intend 返回值: void **********************************************************************************************************************************************************/ voidlieju(intstart,intend) { intk; for(k=start;k<=end;k++) { printf("经过%d次反射后,此时光线的方向为: (%lf,%lf)-->(%lf,%lf)\n",k,pnode[k].x,pnode[k].y,pnode[k+1].x,pnode[k+1].y); } } 附matlab程序代码 %假设圆的半径为1 display('请输入入射的坐标: '); x=input('X: '); y=input('Y: '); display('请输入入射角度'); degree=input('(角度)'); degree=mod(degree,360); %初始化 ifdegree==0 end_y=y; start_y=end_y; start_x=-sqrt(1-y^2); end_x=-start_x; elseifdegree==180 start_y=y; end_y=y; start_x=sqrt(1-y^2); end_x=-start_x; elseifdegree==90 end_x=x; start_x-x; start_y=-sqrt(1-x^2); end_y=-start_y; elseifdegree==270 start_x=x; end_x=x; start_y=sqrt(1-x^2); 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-x1^2-y1^2); start_x=x1-len*cos(degree); start_y=y1-len*sin(degree); end_x=x1+len*cos(degree); end_y=y1+len*sin(degree); end x_temp=x: (end_x-x)/200: end_x; y_temp=y: (end_y-y)/200: end_y; %开始反射 m=input('请输入反射的次数'); clareset figure (1); ezplot('x^2+y^2=1'); holdon; plot(x,y,'*'); holdon; plot(x_temp,y_temp,'r'); holdon; i=1; whilei<=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'); holdon; end plot(end_x,end_y,'*'); axis([-11-11]);%调整x轴y轴坐标范围 axissquare;%使x轴y轴等长 gridon; 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 #defineR1//圆的半径备注: 修改时,注意改变后面printf函数输出时的格式 typedefstructpnode//一个点的3维坐标 { doublex; doubley; doublez; }Coordinate; Coordinatepnode[100]={0,0,0};//储存各反射点坐标 //子函数声明********************************************************************************************************************************************** intmy_func(doubledeep,doubler_length,doublev_x,doublev_y,doublev_z);//主要功能函数,计算各反射点,并返回总反射次数 intmy_init(doublex0,doubley0,doublev_x,doublev_y);//初始化条件,并返回反射弦长 voidlieju(intstart,intend);//输出第start到第end次反射过程 //主函数******************************************************************************************************************************************************* voidmain() { inti,n,start,end; charinput_flag=1,flag=0; doubleangle,x0,y0,v_x,v_y,v_z,deep; doubler_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圆柱筒半径为%d\n",R);//坐标建立方式: 以圆柱筒底面所在平面为xoy坐标面 scanf("%lf,%lf,%lf,%lf,%lf,%lf",&x0,&y0,&deep,&v_x,&v_y,&v_z); if(x0*x0+y0*y0 input_flag=0; else printf("输入错误,请重新输入\n"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 场论 函数 作业