MATLAB数值分析实验四(雅各比、高斯赛德尔迭代,以及二分法和牛顿迭代解非线性方程)

发布时间 : 星期一 文章MATLAB数值分析实验四(雅各比、高斯赛德尔迭代,以及二分法和牛顿迭代解非线性方程)更新完毕开始阅读

佛山科学技术学院

实 验 报 告

课程名称 数值分析 实验项目 迭代法

专业班级 机械工程 姓 名 余红杰 学 号 2111505010 指导教师 陈剑 成 绩 日 期 月 日

一. 实验目的

1、 在计算机上用Jacobi迭代法和Gauss-Seidel迭代法求线性方程组 。 2、 在计算机上用二分法和Newton迭代法求非线性方程 的根。 二. 实验要求

1、按照题目要求完成实验内容; 2、写出相应的Matlab 程序;

3、给出实验结果(可以用表格展示实验结果); 4、分析和讨论实验结果并提出可能的优化实验。 5、写出实验报告。 三. 实验步骤

1、用Matlab编写Jacobi迭代法和Gauss-Seidel迭代法求线性方程组Ax?b的程序。 2、用Matlab编写二分法和Newton法求非线性方程f(x)?0的根程序。

?3?3、设A??0??2?0?2??21?,b?(1,3,1)T,对于线性方程组Ax?b,考虑如下问题: 12??(1)分别写出Jacobi迭代矩阵和Gauss-Seidel迭代矩阵

(2)用Jacobi迭代法和Gauss-Seidel迭代法解该方程时,是否收敛?谁收敛的更快? (3)用实验步骤1编好的两种迭代法程序进行实验,通过数值结果验证(2)的结论。 4、用调试好的二分法和Newton迭代法程序解决如下问题

求e5x?sinx?x3?20?0的根,其中控制精度eps?10?8,最大迭代次数M?50。

四. 实验结果 1.%Jacob.m

function [x,B] = Jacob(A,b,n)

%Jacobi迭代求解方程组Ax=b,系数矩阵A,迭代次数n %求解的准备工作,构建各迭代系数阵等: m = length(A); D = diag(diag(A)); L = -tril(A,-1); U = -triu(A, 1); J = D^(-1)*(L+U); B = J;

f = D^(-1)*b;

%初始化x即启动值: x = zeros(m,1);

%根据x(k+1)=Jx(k)+f进行矩阵运算: for i=1:n

x = J*x + f; end

%GauSeid.m

function [x,G] = GauSeid(A,b,n)

%Gauss-Seidel迭代求解方程组Ax=b,系数矩阵A,迭代次数n %求解的准备工作,构建各迭代系数阵等: m = length(A); D = diag(diag(A)); L = -tril(A,-1); U = -triu(A, 1); G = inv(D-L)*U; f = inv(D-L)*b; %初始化矩阵:

%根据x(k+1)=Gx(k)+f进行矩阵运算: x = zeros(m,1); for i = 1:n

x = G*x + f; end

2.%Dichotomy.m

function x=Dichotomy(x1,x2,p,n) %利用二分法求根,区间[x1,x2] %p为精度 a = x1; b = x2;

%进行n次二分:

%第一个条件判断根在a,b区间内

%第二个条件判断是否中间点就是根,是则迭代终止; %第三个条件判断二分后根在中点左侧还是右侧; %第四个条件判断精度是否达标,用区间长度代替 for i=1:n

if f(a)*f(b)<0 x0 = (a+b)/2; p0 = (b-a)/(2^i); if f(x0)==0 x = x0; else

if f(a)*f(x0)<0 b = x0; else a= x0; end end end if p0>p

continue; else x = x0; break; end end

%NewIterat.m

function x=NewIterat(x0,p,n) %利用牛顿迭代法求根;

%x0为启动点,估计的靠近根的值,p为精度,n为迭代次数; syms x1;

%设置一个自变量x1,方便后面的求导: f1 = diff(f(x1));

%进行n次迭代,精度达标会提前终止;

%第一个判断是根据控制条件来确定真实误差是选绝对还是相对误差; %第二个判断是确定精度是否满足要求 for i=1:n

x1 = x0;

x = x0-f(x0)/eval(f1); if x<1

RealDiv = abs(x-x0);

else RealDiv = abs(x-x0)/abs(x); end

if RealDiv>p x0 = x; else break; end end

3.run43.m

clc,clear;

A = [3 0 -2;0 2 1;-2 1 2]; b = [1;3;1]; n1 = 50; n2 =100;

%输入A,b矩阵,设置迭代次数为50次; %调用迭代函数,返回迭代矩阵; [x,B] = Jacob(A,b,n1); xj50 = x;

f1 = max(abs(eig(B))) %显示谱半径,确定收敛性; [x,B] = GauSeid(A,b,n1); xg50 = x;

f2 = max(abs(eig(B))) %谱半径;

xj100 = Jacob(A,b,n2); xg100 = GauSeid(A,b,n2); Jacobi= [xj50,xj100]

%对比迭代50次和100次的结果 GauSei= [xg50,xg100]

%很容易看出准确解为[1;1;1]

4.f.m

function y = f(x)

%所有f(x)=0中f(x)函数; y = exp(5*x)-sin(x)+x^3-20;

下页是具体解时的程序:

联系合同范文客服:xxxxx#qq.com(#替换为@)