数学实验报告利用MALTAB计算非线性方程近似解Word格式.docx
《数学实验报告利用MALTAB计算非线性方程近似解Word格式.docx》由会员分享,可在线阅读,更多相关《数学实验报告利用MALTAB计算非线性方程近似解Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
![数学实验报告利用MALTAB计算非线性方程近似解Word格式.docx](https://file1.bdocx.com/fileroot1/2023-1/23/a2566eb3-3aa5-4e83-9ac5-3f38d5885acc/a2566eb3-3aa5-4e83-9ac5-3f38d5885acc1.gif)
[i,q]=iterate(150000,1000,15,2,0,1,100,10^-6);
公式表意为:
总贷款量=200000-50000=150000;
每月还款100元;
还款期限15年;
还款方式为按月还款;
迭代区间设定为[0,1];
最大迭代次数为100次;
精度要求为10^-6;
最终结果为:
迭代次数:
45;
使用时间0.0035705s;
利率为0.0089457。
(2)公式
由于函数中出现q在分母位置的情况,故不能将迭代区间设为[0,1],为了能够更好地比较各种方法,因此,这里设置一端为1,一端尽量小。
经测试,当设置值比
还小时,matlab自动认为其为0,故取
。
所得结果如下:
20
使用时间不稳定,最长使用0.0066s,最短使用0.0014s。
利率为0.0089460
(3)使用自己编写的牛顿迭代公式
按照书中给出的牛顿迭代公式,进行迭代。
迭代次数随初值的设定而不断变化,初值的设置要求更加复杂,不能达到
这样小。
这里仅实验了
的情况,事实上,此时的迭代次数已经相当大,用时也不短。
具体数据如下:
33703
使用时间:
1.7434996s
利率为0.0088815
(4)简要小结
从以上三种计算方法可以看出,各种计算方法的结果均相差不多,可见各种方法的正确性都是有保障的。
与此同时不同的方法有着自己不同的特性:
a.由于涉及公式的使用,第二、三种方法都出现了初值设置的问题。
当然这个问题视具体情况而定,不能一概而论;
b.本次实验中发现,前两种办法在给定区域较广的情况下能够较快地收敛到所求的位置,而牛顿法使用的时间反而较多。
为了进一步确认,我将牛顿法的迭代初值置为1,此时共迭代395次,使用时间为0.0251168。
可以发现仍旧较大。
可见自己编写的迭代方法距matlab所用的混合方法相差较远。
2、第二问
(1)月付款
仍旧使用三种方法并进行比较
二次迭代
fzero
自编牛顿法
用时
0.088913
0.005884
0.022
迭代次数
47
23
170
结果
0.0082844
0.0082845
0.008286
(2)年付款
0.009920
0.003590
0.018
44
23
53
0.009241
0.009239
0.009245
从实验结果可以看出,各种方法所得的最终数据基本一致。
由题目假设:
年利率=月利率*12
得到第一中按揭方式的年利率约为0.0,比第二种方法大。
故第二家银行开出的条件较优惠。
3、总结
a.二分迭代和牛顿迭代法通常都能通过迭代收敛得到所要的结果;
b.使用Matlab自带的fzero通常能够更快地得到结果,相比之下牛顿迭代法所用时间较长;
㈤程序清单
1、二重迭代
(1)计算剩余本金的函数
functionleft=Return(All,repay,interest)
All=200000-50000;
repay=1000;
left=All;
fori=1:
15*12
end
(2)主迭代函数
function[i,q]=iterate(All,repay,time,YearOrMonth,a,b,n,tol)
interest=(a+b)/2;
i=0;
diff=Inf;
before=Inf;
while(i<
n&
&
diff>
tol)
left=Return(All,repay,time,YearOrMonth,interest);
if(left>
0)
b=interest;
interest=(a+interest)/2;
else
a=interest;
interest=(b+interest)/2;
end
i=i+1;
diff=abs(before-left);
before=left;
q=interest;
2、fzero
(1)函数
functiony=Function(x)
A=500000;
P=45000;
n=20;
y=A*(1+x)^n-P*((1+x)^n-1)/x;
(2)调用方法
tic;
[q,fv,ef,out]=fzero(@Function,[1*10^-15,1])
time=toc;
3、自编牛顿迭代法
(1)函数的导数
functiony=DeltaFunction(x)
y=A*n*(1+x)^(n-1)-P*(1+x)^(n-2)*((n-2)*x-1)/x^2;
(2)迭代主方法
x0=1;
n=500000;
tol=1e-6;
x=x0;
i=1;
diff=inf;
while(abs(diff)>
tol&
i<
n)
Fxk=Function(x);
FDxk=DeltaFunction(x);
x=x-Fxk/FDxk;
diff=Function(x)-Fxk;
二、气缸阀门
由气缸控制的门关闭状态如图所示。
门宽为a,门枢在H处,与H相距b处有一门销,通过活塞与圆柱形气缸相连。
气缸长
,缸内气体压强为
用力F推开门时,气缸绝热压缩,压强增大。
已知绝热方程为
试通过力矩平衡求在一定力作用下开门角度。
㈡方法与公式
1、MATLAB自带fzero()函数
[x,fv,ef,out]=fzero(@valve,0);
2、牛顿迭代法
3、二分迭代法
4、建模
综上,有:
y=F*a/b-pi*r^2*(l0/(l0-x))^Gamma*p0;
㈢结果与分析
1、
取初值为0
得到结果:
c=0.
alpha=0.7016288=
用时0.0036654s
c=0.4515091
alpha=0.9979021=29.487324
用时0.0808827s
c=0.0539551
alpha=0.9535557=29.284102
用时0.0021362s
4、总结
这道题比较简单,计算过程中没有涉及过多的问题。
不过有关建模,有一个问题值得讨论,即阀门收到的大气压强。
事实上,大气压强大小约为
,远大于题目中阀门的内压强,这样算来题目所给参数有误。
所以只好认为题目所给参数已经考虑了大气压。
有关各种方法的比较如下:
a.三种方法所得结果相差无几,可见结果的正确性;
b.时间使用上与第一题的实验结果基本一致——使用Matlab自带fzero和二分迭代两种方法所用时间相差不大,两者都好于自己编写的牛顿迭代法。
㈣程序清单
1、fzero()
functiony=valve(x)
a=0.8;
b=0.25;
r=0.04;
l0=0.5;
p0=10^4;
Gamma=1.4;
F=25;
(2)调用脚本
alpha=atan(x/b);
angel=alpha/pi*180;
(1)函数与fzero方法一致
(2)函数的导数
functiony=Deltavalve(x)
y=-9*pi*r^2*(l0/(l0-x))^Gamma*p0/(l0-x);
(3)迭代主方法
x0=0;
Fxk=valve(x);
FDxk=Deltavalve(x);
diff=valve(x)-Fxk;
n=500;
tol=1e-6;
x0=0;
xx=l0;
x=(x0+xx)/2;
deltax=valve(x);
if(deltax<
xx=x;
x=(x0+x)/2;
x0=x;
x=(xx+x)/2;
diff=abs(before-x);
before=x;
三、Feigenbaum
给定一迭代公式,计算序列,分析其收敛性。
给定不同的参数值,观察是否由混沌现象出现,并找到前几个分叉点,观察分叉点的极限趋势是否符合Feigenbaum常数解释的规律。
1、为判断相应a的收敛性,对不同的a值进行迭代(给定一个b值),并记录迭代结果,做出图像,从而得出结论。
2、为说明b的任意性,借助书中所给的有关混沌的示例,将其进行改写,并重写迭代函数,得到如下迭代过程
forbb=b
(1):
b(3):
b
(2)
kr=kr+1;
y(kr,1)=feval(iter_fun,x0,a,bb);
fori=2:
n
(2)
y(kr,i)=feval(iter_fun,y(kr,i-1),a,bb);
3、迭代函数
4、为判断是否有混沌现象以及确定分叉点,将上述二重迭代过程的对象由b转为a,即给定一个b值,观察a的变化对迭代终值的影响即可。
1、a固定
(1)a=5
有图可以看出,当迭代次数足够大时,值趋于稳定,收敛到一点,这一点的值约为0.3218876。
从图中可以看出,a=5时,对任意b>
0,{
}收敛,且由图中趋势以及函数的形式可以看出,b增大后,{
}将仍旧收敛,而且收敛值逐渐减小,趋近于0。
(2)a=11
由图可以看出,当a=11时,迭代不再收敛到一个点,而是有两个收敛的子序列,分别趋于0.6和0.9。
从图中可以看出,当a=11时,对任意b,{
}均收敛到两个子列中,且两个子列的极限值随着b的增加不断减小,趋于0。
(3)a=15
实验结果表示,我们已经已经无法从图中准确地判断迭代是否收敛。
大体上看并不收敛。
至于具体情况,需要进一步分析。
实验结果表示,当a=15时,对任意b,已经不存在确定收敛子列。
2、观察分叉与混沌
将a设定在一个范围内变动,固定b的值。
从图中可以看出,实验出现了明显的分岔与混沌的现象,通过图像以及数据结果,我们可以大体上判断分岔点的位置。
改变b值继续观察。
可以发现,b的更改对实验结果没有本质的影响,从坐标上看我们发现迭代值发生了变化,但是它们所构成的图像相差无几。
3、计算分岔点
由
得
令
得到
由稳定性有
联立两个式子,进行化简,令t=b*x
最终得到
exp(-x
(1))+1/(x
(2)*(1-x
(1)))=0
exp(x
(1)/(1-x
(1)))-(x
(1)-1)/x
(2)=0
其中x
(1)=t=b*x,x
(2)=a。
使用fsolve方法求解,得到:
x*b=1.3196870
=7.9933554
再由y’=-1,同理得到
x*b=0.
=12.487370
对于更高阶的分岔点,由于计算非常复杂,这里没有实际计算,仅从图中大致读出其值。
=14.30
=14.62
4、观察是否符合规律
n=2时,A=2.8593
n=3时,A=5.5969
有向4.6692收敛的态势。
5、小结
本道题应当说是这次作业中最复杂的一道,题目意思明确,但是实验过程中则需测试相当多的数据。
另一方面,在计算分岔点时,由于题目所给迭代函数为超越函数,因此计算很复杂,但是这一项本身就又需要用到刚刚学习的非线性方程求解。
当然,这也很好地锻炼了我们解决实际问题的能力。
总体来说收获较大。
1、迭代函数
functiony=iter(x,a,b)
y=a*x*exp(-b*x);
2、b为变量的迭代
functionchaos1(iter_fun,a,b,n)
x0=1;
kr=0;
plot([b
(1):
b
(2)],y(:
n
(1)+1:
n
(2)),'
k.'
);
3、a为变量的迭代
functionchaos(iter_fun,a,b,n)
foraa=a
(1):
a(3):
a
(2)
y(kr,1)=feval(iter_fun,x0,aa,b);
y(kr,i)=feval(iter_fun,y(kr,i-1),aa,b);
plot([a
(1):
a
(2)],y(:
4、调用脚本
chaos(@iter,[1,17,0.02],5,[100,200]);
四、体验与收获
这是本学期数学实验的第四次作业,总体来说不太顺利。
事实上,这次作业的三道题里,我每一道题都在题目的理解上花了不少时间,尤其是第一题有关按揭的地方。
不过现在想来,数学实验应当就是这样一门应用类课程,它需要我们以实际情况为背景正确地进行建模,然后才能做进一步的分析和计算。
总体来说有如下收获:
1、学习了非线性方程组的求解方法;
2、初步了解了各种算法内容,并在一定程度上学会了灵活使用;
3、对数学实验这门课程有了进一步的认识;
4、进一步熟悉了Matlab的调试功能;
仅供个人用于学习、研究;
不得用于商业用途。
notforcommercialuse.
Nurfü
rdenpersö
nlichenfü
rStudien,Forschung,zukommerziellenZweckenverwendetwerden.
Pourl'
é
tudeetlarechercheuniquementà
desfinspersonnelles;
pasà
desfinscommerciales.
толькодлялюдей,которыеиспользуютсядляобучения,исследованийинедолжныиспользоватьсявкоммерческихцелях.
以下无正文