计算方法上机实验报告-MATLAB 下载本文

内容发布更新时间 : 2024/5/20 0:49:36星期一 下面是文章的全部内容请认真阅读。

《计算方法》实验报告

指导教师:学 院:班 级:团队成员:

1

一、题目

例2.7应用Newton迭代法求方程x2?x?1?0在x?1附近的数值解

xk,并使其满足xk?xk?1?10?8

原理:

在方程f?x??0解的隔离区间?a,b?上选取合适的迭代初值x0,过曲线y?f?x?的点x0,f?x0?引切线

??l1:y?f?x0??f'?x0??x?x0?

其与x轴相交于点:x1? x0? 点?x1,f?x1?? 引切线

f?x0? f'?x0?,进一步,过曲线y?f?x?的

l2: y?f?x1??f'?x1??x?x1?

f?x1?其与x轴相交于点:x2? x1?

f'?x1?如此循环往复,可得一列逼近方程f?x??0精确解x*的点

x0,x1,,xk,,其一般表达式为:

xk? xk?1? f?xk?1? f'?xk?1?

该公式所表述的求解方法称为Newton迭代法或切线法。

2

程序:

function y=f(x)%定义原函数 y=x^3-x-1; end

function y1=f1(x0)%求导函数在x0点的值 syms x;

t=diff(f(x),x); y1=subs(t,x,x0); end

function newton_iteration(x0,tol)%输入初始迭代点x0及精度tol x1=x0-f(x0)/f1(x0);k=1;%调用f函数和f1函数 while abs(x1-x0)>=tol

x0=x1;x1=x0-f(x0)/f1(x0);k=k+1; end

fprintf('满足精度要求的数值为x(%d)=%1.16g\\n',k,x1); fprintf('迭代次数为k=%d\\n',k); end

结果:

3

二、题目

例3.7试利用Jacobi迭代公式求解方程组

?5??1???1???1?1?110?1?15?1?1?1??x1???4?????x?1???2???12??1??x3??8? ?????10??x4??34?要求数值解X(k)满足X?X(k)组的精确解。

2?10?4,其中X?(1,2,3,4)T为方程

原理:

?a11?a21将线性方程组的系数矩阵A?????an1a12a22an2a1n?a2n??分解为??ann?A?L?D?U,其中D=diag(a11,a22,?0?a?21L=?a31???a?n100a32an2000an,n?1,ann),

a13a2300a1n?a2n??? ?an?1,n?0??0??0a12?000???0?,U=?????00?000???当对角阵D可逆时,方程组AX?b 可等价地写成

X??D?1?L?U?X? D?1b ,

据此可得Jacobi迭代公式为

X?k?1???D?1?L?U?X??? D?1b, k?0,1,k,

4

其中X?k?=x1,x2,,xn??k??k??k??T?Rn,该迭代公式也可以写成如下的分

量形式

x(k?1)i1?aiin?(k?1)??bi??aijxj?,i?1,2,j?1,j?i??,n

程序:

function jacobi()

%输入矩阵A、b、精度tol%

A=[5 -1 -1 -1; -1 10 -1 -1; -1 -1 5 -1; -1 -1 -1 10]; b=[-4 12 8 34]'; tol=10^-4;

% A=input('系数矩阵A=');%输入矩阵A % b=input('矩阵b= ');%输入矩阵b

% tol=input('精度要求tol=');%输入精度tol X=inv(A)*b; [n,~]=size(A); D=diag(diag(A)); L=tril(A)-D; U=triu(A)-D; X0=zeros(n,1);

X1=inv(D)*b-inv(D)*(L+U)*X0; X0=X1; X2=X-X0; k=1;

while abs(norm(X2,2))>=tol

X1=inv(D)*b-inv(D)*(L+U)*X0; X0=X1; X3=X-X0; %收敛性判断%

if norm(X3,2)>norm(X2,2) break; else

X2=X3; k=k+1; end end

% 结果输出% if X2~=X3

5