内容发布更新时间 : 2024/12/23 2:45:24星期一 下面是文章的全部内容请认真阅读。
哈工大A16公寓1214室 院士之家团队之作品
(Ps:请各位师兄弟姐妹们抄的时候注意改动一下,尽量不要太雷同)
实验报告一
题目: 非线性方程求解
摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。本实验采用两种常见的求解方法二分法和Newton法及改进的Newton法。
前言:(目的和意义)
掌握二分法与Newton法的基本原理和应用。 数学原理:
对于一个非线性方程的数值解法很多。在此介绍两种最常见的方法:二分法和Newton法。
对于二分法,其数学实质就是说对于给定的待求解的方程f(x),其在[a,b]上连续,f(a)f(b)<0,且f(x)在[a,b]内仅有一个实根x*,取区间中点c,若,则c恰为其根,否则根据f(a)f(c)<0是否成立判断根在区间[a,c]和[c,b]中的哪一个,从而得出新区间,仍称为[a,b]。重复运行计算,直至满足精度为止。这就是二分法的计算思想。
Newton法通常预先要给出一个猜测初值x0,然后根据其迭代公式
xk?1?xk?f(xk) 'f(xk)产生逼近解x*的迭代数列{xk},这就是Newton法的思想。当x0接近x*时收敛很快,但是当x0选择不好时,可能会发散,因此初值的选取很重要。另外,若将该迭代公式改进为
xk?1?xk?rf(xk) f'(xk)其中r为要求的方程的根的重数,这就是改进的Newton法,当求解已知重数的方程的根时,在同种条件下其收敛速度要比Newton法快的多。
程序设计:
本实验采用Matlab的M文件编写。其中待求解的方程写成function的方式,如下
function y=f(x); y=-x*x-sin(x);
写成如上形式即可,下面给出主程序。
二分法源程序:
.1.
哈工大A16公寓1214室 院士之家团队之作品
(Ps:请各位师兄弟姐妹们抄的时候注意改动一下,尽量不要太雷同)
clear
%%%给定求解区间 b=1.5; a=0; %%%误差 R=1;
k=0;%迭代次数初值 while (R>5e-6) ; c=(a+b)/2; if f12(a)*f12(c)>0; a=c; else b=c; end
R=b-a;%求出误差 k=k+1; end
x=c%给出解
Newton法及改进的Newton法源程序:
clear
%%%% 输入函数
f=input('请输入需要求解函数>>','s') %%%求解f(x)的导数 df=diff(f);
%%%改进常数或重根数 miu=2; %%%初始值x0
x0=input('input initial value x0>>'); k=0;%迭代次数
max=100;%最大迭代次数
R=eval(subs(f,'x0','x'));%求解f(x0),以确定初值x0时否就是解 while (abs(R)>1e-8)
x1=x0-miu*eval(subs(f,'x0','x'))/eval(subs(df,'x0','x')); R=x1-x0; x0=x1;
.2.
哈工大A16公寓1214室 院士之家团队之作品
(Ps:请各位师兄弟姐妹们抄的时候注意改动一下,尽量不要太雷同)
k=k+1;
if (eval(subs(f,'x0','x'))<1e-10); break end
if k>max;%如果迭代次数大于给定值,认为迭代不收敛,重新输入初值 ss=input('maybe result is error,choose a new x0,y/n?>>','s'); if strcmp(ss,'y')
x0=input('input initial value x0>>'); k=0; else break end end end
k;%给出迭代次数 x=x0;%给出解
结果分析和讨论:
x2?0在[1,2]内的根。(??5*10?6,下同) 1. 用二分法计算方程sinx?2计算结果为
x= 1.40441513061523;
f(x)= -3.797205105904311e-007; k=18;
由f(x)知结果满足要求,但迭代次数比较多,方法收敛速度比较慢。
2. 用二分法计算方程x3?x?1?0在[1,1.5]内的根。 计算结果为
x= 1.32471847534180; f(x)= 2.209494846194815e-006; k=17;
由f(x)知结果满足要求,但迭代次数还是比较多。
3. 用Newton法求解下列方程 a) xex?1?0 x0=0.5; 计算结果为
x= 0.56714329040978;
.3.
哈工大A16公寓1214室 院士之家团队之作品
(Ps:请各位师兄弟姐妹们抄的时候注意改动一下,尽量不要太雷同)
f(x)= 2.220446049250313e-016; k=4;
由f(x)知结果满足要求,而且又迭代次数只有4次看出收敛速度很快。
b) x3?x?1?0 x0=1;
c) (x?1)2(2x?1)?0 x0=0.45, x0=0.65;
当x0=0.45时,计算结果为
x= 0.49999999999983;
f(x)= -8.362754932994584e-014; k=4;
由f(x)知结果满足要求,而且又迭代次数只有4次看出收敛速度很快,实际上该方程确实有真解x=0.5。
当x0=0.65时,计算结果为
x= 0.50000000000000; f(x)=0; k=9;
由f(x)知结果满足要求,实际上该方程确实有真解x=0.5,但迭代次数增多,实际上当取x0〉0.68时,x≈1,就变成了方程的另一个解,这说明Newton法收敛与初值很有关系,有的时候甚至可能不收敛。
4. 用改进的Newton法求解,有2重根,取??2
(x?1)2(2x?1)?0 x0=0.55;并与3.中的c)比较结果。
当x0=0.55时,程序死循环,无法计算,也就是说不收敛。改??1.5时,结果收敛为
x=0.50000087704286; f(x)=4.385198907621127e-007; k=16;
显然这个结果不是很好,而且也不是收敛至方程的2重根上。
当x0=0.85时,结果收敛为
x= 1.00000000000489; f(x)= 2.394337647718737e-023; k=4;
这次达到了预期的结果,这说明初值的选取很重要,直接关系到方法的收敛性,实际上直接用Newton法,在给定同样的条件和精度要求下,可得其迭代次数k=15,这说明改进后的Newton法法速度确实比较快。 结论:
对于二分法,只要能够保证在给定的区间内有根,使能够收敛的,当时收敛的速度和
.4.
哈工大A16公寓1214室 院士之家团队之作品
(Ps:请各位师兄弟姐妹们抄的时候注意改动一下,尽量不要太雷同)
给定的区间有关,二且总体上来说速度比较慢。Newton法,收敛速度要比二分法快,但是最终其收敛的结果与初值的选取有关,初值不同,收敛的结果也可能不一样,也就是结果可能不时预期需要得结果。改进的Newton法求解重根问题时,如果初值不当,可能会不收敛,这一点非常重要,当然初值合适,相同情况下其速度要比Newton法快得多。
.5.