数值分析课程设计实验报告

更新时间:2024-03-13 03:15:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

数值分析课程设计

实验报告

设计题目:非线性方程求根问题

32设计内容: 1225年,达芬奇研究了方程x并得?2x??102x0?0*到它的一个近似根x,没有人知道他用什么方法得到它。利?1.368808107用本门课程所学的数值方法,设计多种不同的算法并编程计算。 算法介绍:

本文分别采用二分法、不动点迭代法、牛顿法、弦截法、抛物线法对

32?2x??102x0?0非线性方程x进行求根。并对方程进行了实验验证。通

过控制变量由实验得出抛物线法、弦截法、二分法、牛顿法按精度依次降低,3个不动点迭代函数不收敛;抛物线法迭代次数最少,效率最高,弦截法次之。在求非线性方程的根时,二分法适合为根求一个近似值,不动点迭代与迭代函数相关性很大,牛顿法的敛散性与给定的初始值有关,在实践中,运用弦截法、抛物线法比较有效。

一、理论基础 二、 算法结构 一、二分法

否 否 开始 ???2x102x0?0方程x 计算f(a),f(b) 32计算 f((a+b)/2) 是 f((a+b)/2)==0 f((a+b)/2)f(a)<0 是 a = (a+b)/2 (a+b)/2 = b 否 |a-b| < err 是 输出(a+b)/2

结束 二、不动点迭代法

开始 方程为 y=nthroot(20-2*x^2-10*x,3) 输入迭代初始值x0,控制精度 epsilon.迭代次数n, x1=fun(x); n=1; 否 (norm(x1-x)>=1e-6)&&(n<=10000) 是 x=x1; x1=fun(x); n=n+1;

y=x; 结束

三、牛顿迭代法

开始 32x?2x??102x0?0 迭代初始值x0,控制精度e,迭代次数i,i=0 x1=x0 否 fabs(s(x1)-x1)>e 是 i++; x2=s(x1); x1=x2; 是 fabs(s(x1)-x1)>e 否 x=(x1+x2)/2; 输出近似根x,迭代次数i 结束

四、弦截法算法:

开始 32 x?2x??102x0?0输入迭代初始值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; 是 fabs(x1-x0)>e 否 x=(x1+x2)/2; 输出近似根x迭代次数i 结束

五、抛物线算法:

开始 f2==0 f1==0root=x1 root=x1; 输入迭代初始值x0、x1、x2 及输入最大迭代次数N if f2==0 f1=mfun(x0); f2=mfun(x1); if f1==0 root=x0 是 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)); 是 fprintf(是 '迭代次数tol>err 为%\\n',n); 否 循环迭代求根: root=t(3)-2*f3/(B+sign(B)*sqrt(B^2-4*f3*d3))

三、程序代码及实验验证

1、确定根的取值范围:

图像程序:

p =[1,2,10,-20]; xi1 =-8:0.001:8; xi2 = -2:0.001: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,1.5]中,由此可确定迭代区间和初始值。

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=-1+ceil((log(b1-a1)- log(epsilon))/ log(2)); for k=1: max1+1 ya=fun(a1); yb=fun(b1); x=(a1+b1)/2; yx=fun(x);

wucha=abs(b1-a1)/2; k=k-1;

if yx==0

a1=x; b1=x; elseif ya*yx<0 b1=x; yb=yx; else

a1=x; ya=yx; end

if b1-a1

function y1=fun(x) y1=x^3+2*x^2+10*x-20; end

输出结果:

本文来源:https://www.bwwdw.com/article/fln8.html

Top