文档介绍:数值分析课程设计
实验报告
设计题目:非线性方程求根问题
设计内容: 1225年,达芬奇研究了方程并得到它的一个近似根,没有人知道他用什么方法得到它。利用本门课程所学的数值方法,设计多种不同的算法并编程计算。
算法介绍:
本文分别采用二分法、不动点迭代法、牛顿法、弦截法、抛物线法对非线性方程进行求根。并对方程进行了实验验证。通过控制变量由实验得出抛物线法、弦截法、二分法、牛顿法按精度依次降低,3个不动点迭代函数不收敛;抛物线法迭代次数最少,效率最高,弦截法次之。在求非线性方程的根时,二分法适合为根求一个近似值,不动点迭代与迭代函数相关性很大,牛顿法的敛散性与给定的初始值有关,在实践中,运用弦截法、抛物线法比较有效。
一、理论基础
算法结构
一、二分法否
开始
|a-b| < err
a = (a+b)/2
(a+b)/2 = b
否
是
f((a+b)/2)f(a)<0
否
是
f((a+b)/2)==0
计算 f((a+b)/2)
方程计算f(a),f(b)
计算f(a),f(b),
是
输出(a+b)/2
结束
二、不动点迭代法
开始
方程为
y=nthroot(20-2*x^2-10*x,3)
输入迭代初始值x0,,
x1=fun(x);
n=1;
否
(norm(x1-x)>=1e-6)&&(n<=10000)
是
x=x1;
x1=fun(x);
n=n+1;
y=x;
结束
三、牛顿迭代法
开始
迭代初始值x0,控制精度e,迭代次数i,i=0
x1=x0
fabs(s(x1)-x1)>e
i++;
x2=s(x1);
x1=x2;
输出近似根x,迭代次数i
x=(x1+x2)/2;
结束
fabs(s(x1)-x1)>e
否
是
是
否
四、弦截法算法:
开始
输入迭代初始值x0 x1,控制精度e,循环次数i,i=0
fabs(x1-x0)>e
i++;
x2=x1-s(x1)*(x1-x0)/(s(x1)-s(x0));
x0=x1;
x1=x2;
x=(x1+x2)/2;
输出近似根x迭代次数i
结束
fabs(x1-x0)>e
否
是
是
否
五、抛物线算法:
开始
输入迭代初始值x0、x1、x2 及输入最大迭代次数N
f1=mfun(x0);
f2=mfun(x1);
root=x0
if f2==0
if f1==0
root=x1
f2==0 f1==0
root=x1;
是
f1*f2>0
disp('输入错误¡')
否
通过求根公式求根:
d1=(f2-f1)/(x1-x0);d2=(f3-f2)/(x2-x1); d3=(d2-d1)/(x2-x0);B=d2+d3*(x2-x1);
root=x2-2*f3/(B+sign(B)*sqrt(B^2-4*f3*d3));
tol>err
是
fprintf('迭代次数为%\n',n);
是
否
循环迭代求根:
root=t(3)-2*f3/(B+sign(B)*sqrt(B^2-4*f3*d3))
三、程序代码及实验验证
1、确定根的取值范围:
图像程序:
p =[1,2,10,-20];
xi1 =-8::8;
xi2 = -2::2;
yi1 = polyval(p,xi1);
yi2 = polyval(p,xi2);
subplot(2,1,1);
plot(xi1,yi1);
xlabel('x') ;
ylabel('y');
title('示意图');
grid on;
legend('x^3+2*x^2+10*x-20');
subplot(2,1,2);
plot(xi2,yi2);
xlabel('x') ;
ylabel('y');
title('示意图');
grid on;
legend('x^3+2*x^2+10*x-20');
图像:
由图像可知:方程的根在区间[1,]中,由此可确定迭代区间和初始值。
2、二分法程序:
function [k,x,wucha,yx]=erfenfa(a,b,epsilon)
if nargin <3
epsilon = 1e-4;
end
a1=a; b1=b;
ya=fun(a1); yb=fun(b1);
if ya* yb>0,
disp('输入错误'), return
end
max1=-