打靶法(含Matlab程序).doc

上传人:b****9 文档编号:100015 上传时间:2022-10-03 格式:DOC 页数:10 大小:77KB
下载 相关 举报
打靶法(含Matlab程序).doc_第1页
第1页 / 共10页
打靶法(含Matlab程序).doc_第2页
第2页 / 共10页
打靶法(含Matlab程序).doc_第3页
第3页 / 共10页
打靶法(含Matlab程序).doc_第4页
第4页 / 共10页
打靶法(含Matlab程序).doc_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

打靶法(含Matlab程序).doc

《打靶法(含Matlab程序).doc》由会员分享,可在线阅读,更多相关《打靶法(含Matlab程序).doc(10页珍藏版)》请在冰豆网上搜索。

打靶法(含Matlab程序).doc

西京学数学软件实验任务书

课程名称

数学软件实验

班级

数0901

学号

07

姓名

李亚强

实验课题

微分方程组边值问题数值算法(打靶法,有限差分法)

实验目的

熟悉微分方程组边值问题数值算法(打靶法,有限差分法)

实验要求

运用Matlab/C/C++/Java/Maple/Mathematica等其中一种语言完成

实验内容

微分方程组边值问题数值算法(打靶法,有限差分法)

成绩

教师

动方向控制减速的推力,主要的控制量只有一个减速推力,减速还会消耗燃料让登月器的质量减小。

所以在极坐标下系统的状态就是x‘=[质量m,角度theta,高度r,角速度omega,径速度v]这五个量,输入就是减速力F。

先列微分方程,dx/dt=f(x)+B*F,其中x是5*1的列向量,质量dm/dt=-F/2940,剩下几个翻下极坐标的手册。

把这个动力学模型放到matlab里就能求解了,微分方程数值解用ode45。

第一问F=0,让你求椭圆轨道非常容易。

注意附件1里说15公里的时候速度是s。

算完以后验证一下对不对,对的话就是他了,不对的话说明这个椭圆轨道有进动,到时再说。

(2) 算出轨道就能计算减速力了。

这时候你随便给个常数减速力到方程里飞船八成都能降落,但不是最优解。

想想整个过程,开始降落之前飞船总机械能就那么多,你需要对飞船做负功让机械能减到0。

题目里写发动机喷出翔的相对速度是一定的,直觉告诉我飞船速度快的时候多喷一些速度慢的时候少喷一些,可以提高做负功的效率。

但是多喷也不能超过上限7500N,所以这就是一个带约束优化问题,matlab里边有专用的优化函数,用fmincon就好。

找出最优解以后把过程画出来,看看F可不可以是那5个状态量的线性组合,如果是的话就非常happy,不是的话再说。

三四阶段你可以扯点图像识别,什么二维复利叶分解找平坦区域,怎么一边下降一边根据自身状态调整路径之类的。

五六阶段还真不知道说什么。

一二阶段肯定是重点啦

(3) 误差分析其实还挺难的。

可能的误差来源是地球的引力,月亮绕地球向心加速度,太阳的引力(可能会很小),对自身速度、角度的测量误差(比如你测出自身当前速度100m/s但实际上是105m/s),控制的时候F大小以及角度的误差(比如你想朝正前方向喷2000N但实际上偏了2度而且F=2010N之类)。

上一问已经求出了最优控制策略和飞船路线,把这些扰动加进去以后算出新的路线减掉理想路线求偏差,然后随便用个卡尔曼滤波器把误差给校正

All for Joy

2014/9/13 11:

14:

38

老师的思路,求大神解答给我一份呀

实验二十七实验报告

实验名称:

微分方程组边值问题数值算法(打靶法,有限差分法)。

实验目的:

进一步熟悉微分方程组边值问题数值算法(打靶法,有限差分法)。

实验要求:

运用Matlab/C/C++/Java/Maple/Mathematica等其中一种语言完成程序设计。

实验原理:

打靶法:

对于线性边值问题

(1)

假设是一个微分算子使:

则可得到两个微分方程:

,,

,,

(2)

,,

,,(3)

方程

(2),(3)是两个二阶初值问题.假设是问题

(2)的解,是问题(3)的解,且,则线性边值问题

(1)的解为:

有限差分法:

基本思想是把连续的定解区域用有限个离散点构成的网格来代替,这些离散点称作网格的节点;把连续定解区域上的连续变量的函数用在网格上定义的离散变量函数来近似;把原方程和定解条件中的微商用差商来近似,积分用积分和来近似,于是原微分方程和定解条件就近似地代之以代数方程组,即有限差分方程组,解此方程组就可以得到原问题在离散点上的近似解。

然后再利用插值方法便可以从离散解得到定解问题在整个区域上的近似解。

实验内容:

%线性打靶法

function[k,X,Y,wucha,P]=xxdb(dydx1,dydx2,a,b,alpha,beta,h)

n=fix((b-a)/h);X=zeros(n+1,1);CT1=[alpha,0];

Y=zeros(n+1,length(CT1));Y1=zeros(n+1,length(CT1));

Y2=zeros(n+1,length(CT1));

X=a:

h:

b;

Y1(1,:

)=CT1;

CT2=[0,1];Y2(1,:

)=CT2;

fork=1:

n

k1=feval(dydx1,X(k),Y1(k,:

))

x2=X(k)+h/2;y2=Y1(k,:

)'+k1*h/2;

k2=feval(dydx1,x2,y2);

k3=feval(dydx1,x2,Y1(k,:

)'+k2*h/2);

k4=feval(dydx1,X(k)+h,Y1(k,:

)'+k3*h);

Y1(k+1,:

)=Y1(k,:

)+h*(k1'+2*k2'+2*k3'+k4')/6,k=k+1;

end

u=Y1(:

1)

fork=1:

n

k1=feval(dydx2,X(k),Y2(k,:

))

x2=X(k)+h/2;y2=Y2(k,:

)'+k1*h/2;

k2=feval(dydx2,x2,y2);

k3=feval(dydx2,x2,Y2(k,:

)'+k2*h/2);

k4=feval(dydx2,X(k)+h,Y2(k,:

)'+k3*h);

Y2(k+1,:

)=Y2(k,:

)+h*(k1'+2*k2'+2*k3'+k4')/6,k=k+1;

end

v=Y2(:

1)

Y=u+(beta-u(n+1))*v/v(n+1)

fork=2:

n+1

wucha(k)=norm(Y(k)-Y(k-1));k=k+1;

end

X=X(1:

n+1);Y=Y(1:

n+1,:

);k=1:

n+1;wucha=wucha(1:

k,:

);

P=[k',X',Y,wucha'];

plot(X,Y(:

1),'ro',X,Y1(:

1),'g*',X,Y2(:

1),'mp')

xlabel('轴\itx');ylabel('轴\ity')

legend('是边值问题的数值解y(x)的曲线','是初值问题1的数值解u(x)的曲线','是初值问题2的数值解v(x)的曲线')

title('用线性打靶法求线性边值问题的数值解的图形')

%有限差分法

function[k,A,B1,X,Y,y,wucha,p]=yxcf(q1,q2,q3,a,b,alpha,beta,h)

n=fix((b-a)/h);X=zeros(n+1,1);

Y=zeros(n+1,1);A1=zeros(n,n);

A2=zeros(n,n);A3=zeros(n,n);A=zeros(n,n);B=zeros(n,1);

fork=1:

n

X=a:

h:

b;

k1(k)=feval(q1,X(k));A1(k+1,k)=1+h*k1(k)/2;

k2(k)=feval(q2,X(k));

A2(k,k)=-2-(h.^2)*k2(k);

A3(k,k+1)=1-h*k1(k)/2;k3(k)=feval(q3,X(k));

end

fork=2:

n

B(k,1)=(h.^2)*k3(k);

end

B(1,1)=(h.^2)*k3

(1)-(1+h*k1

(1)/2)*alpha;

B(n-1,1)=(h.^2)*k3(n-1)-(1+h*k1(n-1)/2)*beta;

A=A1(1:

n-1,1:

n-1)+A2(1:

n-1,1:

n-1)+A3(1:

n-1,1:

n-1);

B1=B(1:

n-1,1);

Y=A\B1;Y1=Y';y=[alpha;Y;beta];

fork=2:

n+1

wucha(k)=norm(y(k)-y(k-1));k=k+1;

end

X=X(1:

n+1);y=y(1:

n+1,1);k=1:

n+1;

wucha=wucha(1:

k,:

);plot(X,y(:

1),'mp')

xlabel('轴\itx');ylabel('轴\ity'),legend('是边值问题的数值解y(x)的曲线')

title('用有限差分法求线性边值问题的数值解的图形'),

p=[k',X',y,wucha'];

打靶法

源代码:

创建M文件:

function

ys=dbf(f,a,b,alfa,beta,h,eps)

ff=@(x,y)[y

(2),f(y

(1),y

(2),x)];

xvalue=a:

h:

b;

%x取值范围

n=length(xvalue)

s0=;

%选取适当的s的初值

x0=[alfa,s0];

%

迭代初值

flag=0;

%用于判断精度

y0=rk4(ff,a,x0,h,a,b);

ifabs(y0(1,n)-beta)<=eps

flag=1;

y1=y0;

else

s1=s0+1;

x0=[alfa,s1];

y1=rk4(ff,a,x0,h,a,b);

ifabs(y1(1,n)-beta)<=eps

flag=1;

end

end

ifflag~=1

whileabs(y1(1,n)-beta)>eps

s2=s1-(y1(1,n)-beta)*(s1-s0)/(y1(1,n)-y0(1,n));

x0=[alfa,s2];

y2=rk4(ff,a,x0,h,a,b);

s0=s1;

s1=s2;

y0=y1;

y1=y2;

end

end

xvalue=a:

h:

b;

yvalue=y1(1,:

);

ys=[xvalue',yvalue'];

function

x=rk4(f,t0,x0,h,a,b)

%rung-kuta

法求每个点的近似值(参考大作业一)

t=a:

h:

b;

%迭代区间m=length(t);

%区间长度

t

(1)=t0;

x(:

1)=x0;

%迭代初值

fori=1:

m-1

L1=f(t(i),x(:

i));

L2=f(t(i)+h/2,x(:

i)'+(h/2)*L1);

L3=f(t(i)+h/2,x(:

i)'+(h/2)*L2);

L4=f(t(i)+h,x(:

i)'+h*L3);

x(:

i+1)=x(:

i)'+(h/6)*(L1+2*L2+2*L3+L4);

end

4.举例求二阶非线性方程的边值问题:

在matlab控制台中输入:

f=@(x,y,z)(x^2+z*x^2);

x0l=0;

x0u=2*exp(-1);

alfa=0;

beta=2;

h=

dbf(f,x0l,x0u,y0l,y0u,h,1e-6);

>>y=ans(:

2);

x=ans(:

1);

>>plot(x,y,'-r')

>>

结果:

再输入:

>>m=0:

:

2;

>>n=m.*exp(-1/2*m);

>>plot(n,m)

>>plot(x,y,'-r',n,m,'-b')

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1