实验一 非线性方程求根
一、实验目的
(1)熟悉二分法、牛顿迭代法求解非线性方程的计算过程;
(2)设计出相应的算法,编制相应的函数子程序。
二、实验内容
(1)画出二分法、牛顿迭代法的程序框图,编写并调试相应的函数子程序;
(2)分别用二分法、牛顿迭代法求解非线性方程在 (1, 2) 区间内的近似根,要求保留6位有效数字,并比较两种算法的收敛速度。
三、程序框图及实验步骤
3.1二分法程序框图:
3.2二分法实验步骤
3.2.1编写二分法程序
function [k,X]=bisection(f,a,b,Eps,N)
f=inline('x^3+4*x^2-10');
a=input('请输入解区间下限a:');
b=input('请输入解区间上限b:');
Eps=input('请输入精度eps:');
N=input('请输入循环次数N:');
for k =1:N
A(k)=a;
B(k)=b;
ya=feval(f,a);
yb=feval(f,b);
temp=(a+b)/2;
X(k)=temp;
yt=feval(f,temp);
F(k)=yt;
if abs(yt) break; end if yt*ya<0 a=a; b=temp; elseif yt*yb<0 a=temp; b=b; end end sprintf(X); end 3.2.2运行并输入初始值 3.2.3 得计算结果及运行时间 牛顿迭代程序框图 3.3牛顿迭代法实验步骤 3.3.1编写牛顿迭代法程序 function result= newdoniteration(x0,eps,N) x0=input('请输入迭代初值x0:'); eps=input('请输入精度eps:'); N=input('请输入预计迭代次数:'); tic y=inline('x^3 + 4*x^2 - 10'); dy=inline('3*x^2 + 8*x'); for k=1:N fx0=y(x0); dfx0=dy(x0); x1=x0-fx0/dfx0; if dfx0==0 fprintf('导数为0'); break elseif abs(x1-x0) fprintf('x*=%.5fn',x0); fprintf('f(x*)=%.5fn',f(x1)); fprintf('迭代次数n=%dn',k); break else x0=x1; end end toc end 3.3.2运行并输入初始值 3..3.3 得计算结果及运行时间 3.4比较二分法与牛顿迭代法收敛速度 二分法迭代了18次,用时0.022190s 牛顿迭代法迭代了4次,用时0.005600s,由此可知牛顿迭代法得收敛速度高于二分法迭代速度。 实验二 线性方程组的迭代解法 1.实验目的 (1)熟悉雅可比迭代法、高斯-赛德尔迭代法求解线性方程组的计算过程; (2)设计出相应的算法,编制相应的函数子程序。 2.实验内容 (1)画出雅可比迭代法、高斯-赛德尔迭代法的程序框图,编写并调试相应的函数子程序; (2)分别用雅可比迭代法、高斯-赛德尔迭代法求解下述线性方程组,并比较两种算法的收敛速度。 3.程序框图及实验步骤 3.1雅可比迭代法 程序框图 3.1.1编写雅可比迭代法程序 function [x,n]=jacobi(A,b,x0,eps) A=input('请输入系数矩阵A:'); b=input('请输入常数矩阵b:'); x0=input('请输入xi初始值矩阵x0:'); eps=input('请输入需要精度:'); D=diag(diag(A));%%求对角矩阵 L=-tril(A,-1);%%求下三角 U=-triu(A,1);%%求上三角 B=D(L+U); f=Db; x=B*x0+f; n=1; while norm(x-x0,'inf')>=eps %%用无穷范数去逼近 Y=sprintf('% .4f',x), N=sprintf('%d',n), x0=x; x=B*x0+f; n=n+1; End 3.1.2运行并初始化输入 3.1.3运行结果 3.2高斯——赛德尔方法 程序框图 3.2.1编写高斯赛德尔方法程序 function [x,n]=gauseidel(A,b,x0,eps) A=input('请输入系数矩阵A:'); b=input('请输入常数矩阵b:'); x0=input('请输入xi初始值矩阵x0:'); eps=input('请输入需要精度:'); tic D=diag(diag(A))%%求对角矩阵 L=-tril(A,-1);%%求下三角 U=-triu(A,1);%%求上三角 B=(D-L)U; f=(D-L)b; x=B*x0+f; n=1; while norm(x-x0,inf)>=eps %%用无穷范数去逼近 Y=sprintf('% .4f',x), N=sprintf('%d',n), x0=x; x=B*x0+f; n=n+1; end toc end 3.2.2运行程序及初始化输入 3.2.3运行结果 3.3比较雅可比方法与高斯赛德尔方法 由两方法得运算结果对比可知,在相同精度要求下,雅可比法迭代了18次,运算时间为0.011568s;高斯赛德尔迭代了9次,运算时间为0.008258s,因此,高斯赛德尔得收敛速度更快。 实验三 插值方法 1. 实验目的 (1)熟悉拉格朗日插值、牛顿插值等基本插值方法; (2)设计出相应的算法,编制相应的函数子程序。 2.实验内容 (1)画出拉格朗日插值算法、牛顿插值算法的程序框图,编制并调试相应的函数子程序; (2)已知函数四个点的数据如下表,试用拉格朗日插值确定函数在x=2.101,4.234处的函数值; x 1.1 2.3 3.9 5.1 y 3.887 4.276 4.651 2.117 (3)已知试用牛顿插值公式求5^0.5的近似值。 3.程序框图与实验步骤 3.1拉格朗日程序框图 3.1.1编写拉格朗日程序 format long; x0=[1.1,2.3,3.9,5.1]; y0=[3.887,4.276,4.651,2.117]; n=length(x0); L=0; l=1; %x=str2double(input('')); x=input('请输入需插值计算的x值:'); Tic for i =1:n for j =1:n if i~=j l=l*(x-x0(j))/(x0(i)-x0(j)); end end L=L+y0(i)*l; l=1; end fprintf('x=%.3fn',L); Toc 3.1.2运行及初始化输入 3.1.3运行结果 3.2牛顿插值方法 3.2.1牛顿插值程序框图 3.2.2编写牛顿插值程序 function [A,y]= newtoncz(X,Y,x) x=input('请输入需计算的x:') tic X=[1,4,9]; Y=[1,2,3]; n=length(X); m=length(x); for t=1:m z=x(t); A=zeros(n,n);A(:,1)=Y'; s=0.0; y=0.0; c1=1.0; for j=2:n for i=j:n A(i,j)=(A(i,j-1)- A(i-1,j-1))/(X(i)-X(i-j+1)); end end for k=1:n p=1.0; for j=1:k-1 p=p*(z-X(j)); end s=s+A(k,k)*p; end ss(t)=s; end y=ss; A=[X',A]; fprintf('y=%.4fn',y); toc End 3.2.3运行程序并初始化输入 3.2.4运行结果 实验四 数值积分 1.实验目的 (1)熟悉复化梯形求积公式、复化辛浦生求积公式; (2)设计出相应的算法,编制相应的函数子程序; 2.实验内容 (1)画出复化梯形求积算法、复化辛浦生求积算法的程序框图,编制并调试相应的函数子程序; (2)分别用复化梯形公式、复化辛浦生公式计算定积分,取n=2,4,8,16。 3.程序框图及实验步骤 3.1复化梯形求积公式 3.1.1程序框图 3.1.2编写复化梯形求积公式程序 被积函数 function [fx] = Tfunction(x) if x == 0 fx = 1; else fx = sin(x)/x; end end 复化梯形公式 function [result] = complexT( a, b,n) a=input('请输入积分下限a:'); b=input('请输入积分上限b:'); n=input('请输入划分区间数n:'); tic h = (b - a)/n; result = 0; for i = 1:n-1 result = result + Tfunction(a+h*(i-1))+Tfunction(a+h*i); end result = result * h / 2; fprintf('积分结果=%.4fn',result); toc end 3.1.3运行程序并初始化输入 3.1.4运行结果 n=2 n=4 n=8 n=16 3.2复化辛普森公式 3.2.1复化辛普森公式程序框图 3.2.2编写复化辛普森公式程序 被积函数 function [fx] = Tfunction(x) if x == 0 fx = 1; else fx = sin(x)/x; end end 辛普森公式 function [result]=complexsimpson(a,b,n) a=input('请输入积分下限a:'); b=input('请输入积分上限b:'); n=input('请输入划分区间数n:'); tic h=(b-a)/n; result=0; xi=a:h:b; for i =1:n result=result+4*Tfunction(xi(i)+0.5*h); end for k = 2:n result=result+2*Tfunction(xi(k)); end result=(result+Tfunction(a)+Tfunction(b))*h/6; fprintf('复化辛普森公式积分结果为:%.4fn',result); toc End 3.2.3运行程序并初始化输入 3.2.4运行结果 n=2 3.3比较复化梯形公式与复化辛普森公式 由运行结果可知,复化梯形公式在划分区间数较少时,积分结果与实际结果的误差较大,收敛速度慢;复化辛普森公式在划分区间为2时,便比复化梯形公式划分16段的精度更高,收敛速度很快。 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)