jacobi,高斯,牛顿迭代
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二:迭代法求解方程组
姓名:徐烨
学号:08072105
时间:2010-11-17
一、实验目的
利用jacobi 迭代法和gauss-seidei 迭代法求解线性方程组,利用newton 迭代法求解非线性方程组。在求解过程中,利用这三种方法的迭代原理,根据迭代法的求解流程,写出三种迭代法的迭代格式,学习三种迭代法的原理和解题步骤,并使用matlab 软件求解方程。在实验过程中,分别取不同的初值进行求解,并做结果分析,解怒同德方程来比较这三种迭代方法的利弊。
二、实验步骤
newton 迭代法
⒈newton 迭代原理
考虑非线性方程f(x)=0,求解她的困难在于f 是非线性函数。为克服这一困难,考虑它的线性展开。设当前点为Xk, 在Xk 处的Taylor 展开式为
f ()x ≈f ()()()k k k x x x f x -'+
令上式右端为0.解其方程得到
()()
k k k k x f x f x x '-=+1 ⋅⋅⋅=1,0k 此式就称为Newton 公式。
2. newton 迭代法的matlab 实现
function x=newton(fname,dfname,x0,e,N)
%用途:牛顿迭代法解非线性方程组分f(x)=0
%fname 和dfname 分别表示f(x)及其到函数的M 函数句柄或内嵌函数的表达式%x0为迭代初值,e 为精度
%x 为返回数值解,并显示计算过程,设置迭代次数上线N 以防发散
if nargin<5,N=500;end
if nargin<4,e=le-4;end
x=x0;x0=x+2*e;k=0;
fprintf('It.no=%2d x%[2d]=%12.9f\n',k,k,x)
while abs(x0-x)>e&k k=k+1; x0=x;x=x0-feval(fname,x0)/feval(dfname,x0); fprintf('It.no=%2d x[%2d]=%12.9f\n',k,k,x) end if k==N,fprintf('已达到迭代次数上限'); end 在试验中,我用这种方法求 f(x)=x3-3*x-1=0的解 ①初值为2时,新建一个文件,输入: fun=inline('x^3-3*x-1'); dfun=inline('3*x^2-3'); x=newton(fun,dfun,2,0.5e-6) 即可得此方程的解为: It.no= 0 xIt.no= 1 x[ 1]= 1.888888889 It.no= 2 x[ 2]= 1.879451567 It.no= 3 x[ 3]= 1.879385245 It.no= 4 x[ 4]= 1.879385242 x = 1.879385241571817e+000 ②初值为5时,新建一个文件,输入: fun=inline('x^3-3*x-1'); dfun=inline('3*x^2-3'); x=newton(fun,dfun,5,0.5e-6) 即可得此方程的解为: It.no= 0 xIt.no= 1 x[ 1]= 3.486111111 It.no= 2 x[ 2]= 2.562343095 It.no= 3 x[ 3]= 2.075046554 It.no= 4 x[ 4]= 1.902660228 It.no= 5 x[ 5]= 1.879777024 It.no= 6 x[ 6]= 1.879385355 It.no= 7 x[ 7]= 1.879385242 x = 1.879385241571826e+000 ③初值为8时,新建一个文件,输入: fun=inline('x^3-3*x-1'); dfun=inline('3*x^2-3'); x=newton(fun,dfun,8,0.5e-6) 即可得此方程的解为: It.no= 0 xIt.no= 1 x[ 1]= 5.423280423 It.no= 2 x[ 2]= 3.754505841 It.no= 3 x[ 3]= 2.719579123 It.no= 4 x[ 4]= 2.148629510 It.no= 5 x[ 5]= 1.920654127 It.no= 6 x[ 6]= 1.880593045 It.no= 7 x[ 7]= 1.879386323 It.no= 8 x[ 8]= 1.879385242 It.no= 9 x[ 9]= 1.879385242 x = 1.879385241571817e+000 gauss-seidel 实验过程 1.gauss-seidel 迭代原理 将方程组Ax=b (设n i a n ,2,1;0⋅⋅⋅=≠)化成等价方程组: )(1∑≠-=i j j i i i i x a b a x j i ),2,1(n i ⋅⋅⋅= 采用迭代格式: ⎪⎪⎭⎫ ⎝⎛--=∑∑-=+=++111111i j n i j k j ij k j ij i ij k i x a x a b a x ()n i ⋅⋅⋅⋅=,2,1 2.gauss-seidel 迭代法的matlab 实现 function x=jacobi(A,b,x0,emg,N) % A 是线性方程组的系数矩阵 % b 是值向量 % x0是迭代初始向量 % N 是迭代上限,诺迭代次数大于>N,则迭代失败 % emg 是控制精度 % 用gauss-seidei 迭代法求解线性方程组Ax=b 的解 %k 表示迭代次数 %x 表示用迭代法求得的解线性方程组的近似解 if nargin<5 N=500; else N=N; end n=length(b); x1=zeros(n,1); x2=zeros(n,1); x1=x0; k=0; r=max(abs(b-A*x1)); while r>emg for i=1:n sum=0; for j=1:n if i~=j sum=sum+A(i,j)*x1(j); end