数值分析的MATLAB程序
数值分析第二讲MATLAB简介
MATLAB编程入门 MATLAB的编程风格与C语言相同。 常用流程控制语句 if if语句条件 elseif if语句条件 end 终止作用域 for 指定次数的循环 while 不指定次数的循环 break 终止循环 switch 开关语句 case 列出语句 otherwise否则语句 return 返回调用函数 function 函数定义语句
MATLAB常用函数名 数学函数(中文意义略) abs,acos,acosh,angle,asin,asinh,atan,atan2,atanh, ceil,conj,cos,cosh,exp,fix,floor,gcd,imag,lcm,log, log10,real,rem,round,sign,sin,sinh,sqrt,tan,tanh, 构造矩阵函数 eye(n),ones(n),zeros(n):产生n阶单位、全1,全0矩阵 eye(m,n),ones(m.n),zeros(m.n):产生m×n的单位、全1,全 0矩阵 Sparse:构造稀疏矩阵 Size(M)取矩阵M的各维大小(结果为向量) size (M,n) 取矩阵M的第n维大小
例1:构造两个可加减乘的矩阵A,B,C,求A+B,A*C, sin(A)+cos(B),以及取A,B,C的子矩阵作同样的运算。 解:A=[ 1,2,3,4;5 6 7 8; 9 10 11 12]; B=ones(3,4) C= pascal(3) ⑴ D=A+B ⑵ E=sin(A)+cos(B) (3) F=A*C 错误操作:A*B,A+C
MATLAB的基本用法 一、数与变量 MATLAB的内部本质上只有两种类型的数据:实数和字符。 一个实数占8个字节(64比特),一个字符占用1字节(8比特)。 复数由两个实数构成,矩阵元素由字符、实数、复数构成。由矩 阵再构成“struct”(结构)数据类型,字符串是以字符为变量的 行向量。所以表现形式有:字符、字符串、整数、实数、复数、 结构。 characters: ‘char’ 表有符号字符 8bits, ‘uchar’ 无符号字符 8bits. integers :‘short’ 短整数16 bits, ‘long’ 长整数 32 bits, floating-point: ‘single-‘ 表单精度浮点数32bits, ’double‘表双精度浮 点数:64bits
数值分析上机作业(MATLAB)
将系数矩阵 A 分解为:A=L+U+D
Ax=b
⇔ (D + L +U)x = b ⇔ Dx = −(L + U )x + b ⇔ x = −D −1(L + U )x + D −1b x(k +1) = −D −1 (L + U ) x(k ) + D −1b
输入 A,b 和初始向量 x
迭代矩阵 BJ , BG
否
ρ(B) < 1?
按雅各比方法进行迭代
否
|| x (k+1) − x(k) ||< ε ?
按高斯-塞德尔法进行迭代
否
|| x(k+1) − x (k ) ||< ε ?
输出迭代结果
图 1 雅各布和高斯-赛德尔算法程序流程图
1.2 问题求解
按图 1 所示的程序流程,用 MATLAB 编写程序代码,具体见附录 1。解上述三个问题 如下
16
-0.72723528355328
0.80813484897616
0.25249261987171
17
-0.72729617968010
0.80805513082418
0.25253982509100
18
-0.72726173942623
0.80809395746552
0.25251408253388
0.80756312717373
8
-0.72715363032573
0.80789064377799
9
-0.72718652854079
#数值分析Matlab作业
数值分析编程作业2012年12月第二章14.考虑梯形电阻电路的设计,电路如下:电路中的各个电流{i1,i2,…,i8}须满足下列线性方程组:121232343454565676787822/252025202520252025202520250i i V R i i i i i i i i i i i i i i i i i i i i -=-+-=-+-=-+-=-+-=-+-=-+-=-+=这是一个三对角方程组。
设V=220V ,R=27Ω,运用追赶法,求各段电路的电流量。
Matlab 程序如下:function chase () %追赶法求梯形电路中各段的电流量 a=input('请输入下主对角线向量a='); b=input('请输入主对角线向量b='); c=input('请输入上主对角线向量c='); d=input('请输入右端向量d='); n=input('请输入系数矩阵维数n='); u(1)=b(1); for i=2:nl(i)=a(i)/u(i-1); u(i)=b(i)-c(i-1)*l(i); endy(1)=d(1); for i=2:ny(i)=d(i)-l(i)*y(i-1); endx(n)=y(n)/u(n); i=n-1; while i>0x(i)=(y(i)-c(i)*x(i+1))/u(i); i=i-1;end x输入如下: >> chase请输入下主对角线向量a=[0,-2,-2,-2,-2,-2,-2,-2]; 请输入主对角线向量b=[2,5,5,5,5,5,5,5];请输入上主对角线向量c=[-2,-2,-2,-2,-2,-2,-2,0]; 请输入方程组右端向量d=[220/27,0,0,0,0,0,0,0]; 请输入系数矩阵阶数n=8 运行结果如下:x = 8.1478 4.0737 2.0365 1.0175 0.5073 0.2506 0.1194 0.0477第三章14.试分别用(1)Jacobi 迭代法;(2)Gauss-Seidel 迭代法解线性方程组1234510123412191232721735143231211743511512x x x x x ⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=--⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥---⎣⎦⎣⎦⎣⎦ 迭代初始向量(0)(0,0,0,0,0)T x =。
第十章MATLAB的数值分析
• 第一个问题可归结为“已知函数在x0,x1,
– …,xn处的值,求函数在区间[x0,xn]内其它点处的值”,这 种问题适宜用插值方法解决。 – 插值问题可描述为:已知函数在x0,x1,…,xn处的值 y0,y1,…,yn,求函数p(x),使p(xi) = yi。
• 但对第二个问题不宜用插值方法,因为600米已超出所 给数据范围,用插值函数外推插值区间外的数据会 产生较大的误差。
– Q1=prctile(w,25); – Q3=prctile(w,75); – prctile( )函数实现计算样本的百分位数功能
分布形态的测定
• 只用集中趋势和离中趋势来表示所有数据,难免不 够准确。分析总体次数的分布形态有助于识别整个 总体的数量特征。总体的分布形态可以从两个角度 考虑,一是分布的对称程度,另一个是分布的高低。 前者的测定参数称为偏度或偏斜度,后者的测定参 数称为峰度。 • 峰度是掌握分布形态的另一指标,它能描述分布的 平缓或陡峭程度。如果峰度数值等于零,说明分布 为正态;若峰度数值大于零,说明分布呈陡峭状态; 若峰度数值小于零,说明分布形态趋于平缓。
– 解决第二个问题的常用方法是,根据地面到井下 500 处的 数据求出瓦斯浓度与地面到井下距离x之间的近似函数关 系f(x), 由f(x)求井下600米处的瓦斯浓度。
• 插值函数过已知点,拟合函数不一定过已知点。通 常, 插值主要用于求函数值,而拟合的主要目的是求 函数关系。当然,某些问题既可以用插值也可以用 拟合。
插值方法-概述
• 为什么需要插值?
(1) 函数关系y=f(x)没有明确的表达式
(2) y=f(x)表达式复杂,不便于研究和使用
-20 -15
沉陷量/mm 下沉方向为"+"
数值分析中求解非线性方程的MATLAB求解程序
数值分析中求解非线性方程的MATLAB求解程序1. fzero函数:fzero函数是MATLAB中最常用的求解非线性方程的函数之一、它使用了割线法、二分法和反复均值法等多种迭代算法来求解方程。
使用fzero函数可以很方便地求解单变量非线性方程和非线性方程组。
例如,要求解方程f(x) = 0,可以使用以下语法:``````2. fsolve函数:fsolve函数是MATLAB中求解多维非线性方程组的函数。
它是基于牛顿法的迭代算法来求解方程组。
使用fsolve函数可以非常方便地求解非线性方程组。
例如,要求解方程组F(x) = 0,可以使用以下语法:``````3. root函数:root函数是MATLAB中求解非线性方程组的函数之一、它采用牛顿法或拟牛顿法来求解方程组。
使用root函数可以非常方便地求解非线性方程组。
例如,要求解方程组F(x) = 0,可以使用以下语法:``````4. vpasolve函数:vpasolve函数是MATLAB中求解符号方程的函数。
它使用符号计算的方法来求解方程,可以得到精确的解。
vpasolve函数可以求解多变量非线性方程组和含有符号参数的非线性方程。
例如,要求解方程组F(x) = 0,可以使用以下语法:```x = vpasolve(F(x) == 0, x)```vpasolve函数会返回方程组的一个精确解x。
5. fsolve和lsqnonlin结合:在MATLAB中,可以将求解非线性方程转化为求解最小二乘问题的形式。
可以使用fsolve函数或lsqnonlin函数来求解最小二乘问题。
例如,要求解方程f(x) = 0,可以将其转化为最小二乘问题g(x) = min,然后使用fsolve或lsqnonlin函数来求解。
具体使用方法可以参考MATLAB官方文档。
6. Newton-Raphson法手动实现:除了使用MATLAB中的函数来求解非线性方程,还可以手动实现Newton-Raphson法来求解。
数值分析作业-matlab上机作业
数值分析———Matlab上机作业学院:班级:老师:姓名:学号:第二章解线性方程组的直接解法第14题【解】1、编写一个追赶法的函数输入a,b,c,d输出结果x,均为数组形式function x=Zhuiganfa(a,b,c,d)%首先说明:追赶法是适用于三对角矩阵的线性方程组求解的方法,并不适用于其他类型矩阵。
%定义三对角矩阵A的各组成单元。
方程为Ax=d%b为A的对角线元素(1~n),a为-1对角线元素(2~n),c为+1对角线元素(1~n-1)。
% A=[2 -1 0 0% -1 3 -2 0% 0 -2 4 -3% 0 0 -3 5]% a=[-1 -2 -3];c=[-1 -2 -3];b=[2 3 4 5];d=[6 1 -2 1];n=length(b);u(1)=b(1);y(1)=d(1);for i=2:nl(i)=a(i-1)/u(i-1);%先求l(i)u(i)=b(i)-c(i-1)*l(i);%再求u(i)%A=LU,Ax=LUx=d,y=Ux,%Ly=d,由于L是下三角矩阵,对角线均为1,所以可求y(i)y(i)=d(i)-l(i)*y(i-1);endx(n)=y(n)/u(n);for i=(n-1):-1:1%Ux=y,由于U是上三角矩阵,所以可求x(i)x(i)=(y(i)-c(i)*x(i+1))/u(i);end2、输入已知参数>>a=[2 2 2 2 2 2 2];>>b=[2 5 5 5 5 5 5 5];>>c=[2 2 2 2 2 2 2];>>d=[220/27 0 0 0 0 0 0 0];3、按定义格式调用函数>>x=zhuiganfa(a,b,c,d)4、输出结果x=[8.147775166909105 -4.073701092835030 2.036477565178471 -1.017492820111148 0.507254485099400 -0.250643392637350 0.119353996493976 -0.047741598597591]第15题【解】1、编写一个程序生成题目条件生成线性方程组A x=b 的系数矩阵A 和右端项量b ,分别定义矩阵A 、B 、a 、b 分别表示系数矩阵,其中1(10.1;,1,2,...,)j ij i i a x x i i j n -==+=或1(,1,2,...,)1ij a i j n i j ==+-分别构成A 、B 对应右端项量分别a 、b 。
数值分析MATLAB编程——数值积分法
数值分析MATLAB编程——数值积分法1、调用函数--f.Mfunction y=f(x)%------------------------------------------------------------函数1 y=sqrt(4-sin(x)*sin(x));%------------------------------------------------------------函数2 %y=sin(x)/x;%if x==0% y=0;%end%------------------------------------------------------------函数3 %y=exp(x)/(4+x*x);%------------------------------------------------------------函数4 %y=(log(1+x))/(1+x*x);2、复合梯形公式--tixing.M%复合梯形公式clear alla=input('请输入积分下限:');b=input('请输入积分上限:');n=input('区间n等分:');h=(b-a)/n;x=a:h:b;T=0;for k=1:n;T=0.5*h*(f(x(k))+f(x(k+1)))+T;endT=vpa(T,8)3、复合Simpson公式--simpson.M%复合Simpson公式clear alla=input('请输入积分下限:');b=input('请输入积分上限:');n=input('区间n等分:');h=(b-a)/n;x=a:h:b;S=0;for k=1:n;xx=(x(k)+x(k+1))/2;S=(1/6)*h*(f(x(k))+4*f(xx)+f(x(k+1)))+S;endS=vpa(S,8)4、Romberg算法--romberg.M%Romberg算法clear alla=input('请输入积分下限:');b=input('请输入积分上限:');n=input('区间n等分:');num=0:n;R=[num'];h=b-a;T=h*(f(a)+f(b))/2;t(1)=T;for i=2:n+1;u=h/2;H=0;x=a+u;while x<b;H=H+f(x);x=x+h;endt(i)=(T+h*H)/2;T=t(i);h=u;endR=[R,t'];for i=2:n+1for j=n+1:-1:1if j>=it(j)=(4^(i-1)*t(j)-t(j-1))/(4^(i-1)-1);elset(j)=0;endendR=[R,t'];endR=vpa(R,8)R(n,n)5、变步长算法(以复化梯形公式为例)--tixing2.M%复合梯形公式,确定最佳步长format longclear alla=input('请输入积分下限:');b=input('请输入积分上限:');eps=input('请输入误差:');k=1;T1=(b-a)*(f(a)+f(b))/2;T2=(T1+(b-a)*(f((a+b)/2)))/2; while abs((T1-T2)/3)>=epsM=0;n=2^k;h=(b-a)/n;T1=T2;x=a:h:b;for i=1:n;xx=(x(i)+x(i+1))/2;M=M+f(xx);endT2=(T1+h*M)/2;k=k+1;endT=vpa(T2,8)n=2^k。
牛顿插值法matlab程序例题
牛顿插值法是一种常用的数值分析方法,用于构造一个多项式函数,以便在给定的数据点上进行插值。
这个主题在数学和工程领域中有着广泛的应用,特别是在数据拟合和函数逼近方面。
牛顿插值法的核心思想是通过不断地添加新的数据点来构造一个多项式,并利用已知数据点来确定多项式的系数,从而实现对未知数据点的插值预测。
在Matlab中,实现牛顿插值法并不困难,我们可以利用已有的函数和工具来简化计算过程。
下面,我们将通过一个具体的例题来讲解如何使用Matlab编写牛顿插值法的程序,并分析其结果。
我们需要明确牛顿插值法的数学原理。
给定n个互不相同的节点\(x_0, x_1, ... , x_n\),以及在这些节点上的函数值\(f(x_0), f(x_1), ... , f(x_n)\),我们希望构造一个n次插值多项式p(x),满足p(x_i) = f(x_i),i=0,1,...,n。
牛顿插值多项式的一般形式为:\[p(x) = a_0 + a_1(x - x_0) + a_2(x - x_0)(x - x_1) + ... + a_n(x -x_0)(x - x_1)...(x - x_{n-1})\]其中,\[a_i\]表示插值多项式的系数。
通过牛顿插值法的迭代过程,可以逐步求解出这些系数,进而得到插值多项式的表达式。
接下来,我们将以一个具体的例题来演示如何在Matlab中实现牛顿插值法。
假设我们有如下的数据点和函数值:\(x = [1, 2, 3, 4]\)\(f(x) = [1, 4, 9, 16]\)我们希望利用这些数据点来构造一个插值多项式,并在给定的区间上进行插值计算。
在Matlab中,可以通过interp1函数来进行插值计算,该函数支持多种插值方法,包括牛顿插值法。
下面是一个简单的Matlab程序示例:```matlabx = [1, 2, 3, 4];y = [1, 4, 9, 16];xi = 2.5;yi = interp1(x, y, xi, 'spline');disp(['在x=',num2str(xi),'处的插值结果为:',num2str(yi)]);```在这段代码中,我们首先定义了给定的数据点x和对应的函数值y,然后利用interp1函数对x=2.5处的插值结果进行计算。
Matlab与数值分析实验
>> sum
法 2: >>a=1:100; >>sum=a*a’
法 3: >>n=1;
>>sum=0;
>> while n<=100
sum=sum+n*n;
n=n+1;
end
-6-
>> sum * 选择语句
if expression() statements;
[else statements;]
end 例:编写函数文件 demo3 实现 sgn 函数功能
例 2:编写命令文件 demo1 完成以下操作
-4-
建立数组 a=[1,2,3,...,20],b=[1,3,5,...,39],并求 a,b 内积 操作 1) 主窗口点击新建按钮 2) 在弹出的文本编辑窗口添加 a=1:20 b=1:2:39 sum=a*b'
3) 单击保存按钮 将文件命名为 demo1 保存在例 1 新建文件夹中
4) 在 Command Window 中输入 demo1 并回车 例 3:编写函数文件 demo2,返回输入变量的内积
操作:1) 新建 M 文件,编辑如下: function sum=demo2(a,b) sum=a*b';
2) 保存文件在查询目录下,注意不要修改默认名 3) 在 Command Window 中输入
操作:1)新建 M 文件,并编辑如下 function val=demo3(x) if x>0 val=1; elseif x<0 val=-1; else val=0; end 2) 将文件保存在查询目录内 3) >>demo3(0) >>demo3(90) >>demo3(-12)
数值分析大作业(牛顿下山法,拉格朗日法,切比雪夫法)及Matlab程序
课程设计课程名称:数值分析设计题目:学号:姓名:完成时间:2014.11.18题目一: 解线性方程组的直接法 设方程组Ax b =,其中250002511125555111x x x x x x A x x x ⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎣⎦, 矩阵中10.1(0,1,,5)k x k k =+=,b 由相应的矩阵元素计算,使解向量(1,1,,1)T x =。
(1) A 不变,对b 的元素6b 加一个扰动410-,求解方程组;(2) b 不变,对A 的元素22a 和66a 分别加一个扰动610-,求解方程组; (3) 对上述两种扰动方程组的解做误差分析。
一.数学原理:本计算采用直接法中的列主元高斯消元法,高斯列主元消元法原理如下: 1、设有n 元线性方程组如下:1111n n nn a a a a ⎛⎫ ⎪ ⎪ ⎪⎝⎭1nx x ⎛⎫ ⎪ ⎪ ⎪⎝⎭=1nb b ⎛⎫ ⎪ ⎪ ⎪⎝⎭2、第一步:如果a11!=0, 令l i1= ai1/a11, I= 2,3,……,n用(-li1)乘第一个方程加到第i 个方程上,得同解方程组:a (1)11 a (1)12 . . . a (1)1nx 1 b (1)1 a (1)21 a (1)22 . . . a (1)2n x 2 b (1)2 . . . . . . . = . a (1)n-11 a (1)n-12 . . a (1)n-1n x n-1 b (1)n-1 a (1)n1 a (1)n2 . . . a (1)nn x n b (1)n简记为:A (2) x = b (2) 其中a (2)ij = a (1)ij – l i1 * a (1)1j , I ,j = 2,3,..,nb (2)I = b (1)I – l i1 * b (1)1 , I = 2,3,...,n 第二步:如果a (2)22 != 0,令l i2= a (2)i2/a (2)22, I= 3,……,n依据同样的原理,对矩阵进行化间(省略),依次下去,直到完成!最后,得到上三角方程组:a(1)11 a(1)12. . . a(1)1nx1b(1)10 a(1)22 . . . a(1)2nx2b(1)2. . . . . . . = .0 0 . . a(n-1)n-1n xn-1b(n-1)n-10 0 . . . a(n)nn xnb(n)n简记为:A(n) x = b(n)最后从方程组的最后一个方程进行回代求解为:Xn = b(n) / a(n)nnXi = ( b(k)k- ∑ a(k)kj x j ) / a(k)kk二.解题过程:1.由题中所给条件可求出b。
数值分析中求解非线性方程的MATLAB求解程序(6种)
数值分析中求解非线性方程的MATLAB求解程序(6种)数值分析中求解非线性方程的MATLAB求解程序(6种)1.求解不动点function [k,p,err,P]=fixpt(g,p0,tol,max1)%求解方程x=g(x) 的近似值,初始值为p0%迭代式为Pn+1=g(Pn)%迭代条件为:在迭代范围内满足|k|<1(根及附近且包含初值)k为斜率P(1)=p0;for k=2:max1P(k)=feval(g,P(k-1));err=abs(P(k)-P(k-1));relerr=err/(abs(P(k))+eps);p=P(k);if (err<tol)|(relerr<tol)< p="">break;endendif k==max1disp('超过了最长的迭代次数')endP=P';2.二分法function [c,err,yc]=bisect(f,a,b,delta)%二分法求解非线性方程ya=feval(f,a);yb=feval(f,b);if ya*yb>0break;max1=1+round((log(b-a)-log(delta))/log(2));for k=1:max1c=(a+b)/2;yc=feval(f,c);if yc==0a=c;b=c;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;endif b-a<delta< p="">break;endendc=(a+b)/2;err=abs(b-a);yc=feval(f,c);3.试值法function [c,err,yc]=regula(f,a,b,delta,epsilon,max1) %试值法求解非线性方程%f(a)和飞(b)异号ya=feval(f,a);yb=feval(f,b);if ya*yb>0disp('Note:f(a)*f(b)>0');for k=1:max1dx=yb*(b-a)/(yb-ya);c=b-dx;ac=c-a;yc=feval(f,c);if yc==0break;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;enddx=min(abs(dx),ac);if abs(dx)<delta|abs(yc)<epsilon< p="">break;endendc;err=abs(b-a)/2;yc=feval(f,c);4.求解非线性方程根的近似位置function R=approot(X,epsilon)%求解根近似位置%为了粗估算方程f(x)=0在区间[a,b]的根的位置,%使用等间隔采样点(xk,f(xk))和如下的评定准则:%f(xk-1)与f(xk)符号相反,%或者|f(xk)|足够小且曲线y=f(x)的斜率在%(xk,f(xk))附近改变符号。
数值分析matlab实验报告
数值分析matlab实验报告数值分析 Matlab 实验报告一、实验目的数值分析是研究各种数学问题数值解法的学科,Matlab 则是一款功能强大的科学计算软件。
本次实验旨在通过使用 Matlab 解决一系列数值分析问题,加深对数值分析方法的理解和应用能力,掌握数值计算中的误差分析、数值逼近、数值积分与数值微分等基本概念和方法,并培养运用计算机解决实际数学问题的能力。
二、实验内容(一)误差分析在数值计算中,误差是不可避免的。
通过对给定函数进行计算,分析截断误差和舍入误差的影响。
例如,计算函数$f(x) =\sin(x)$在$x = 05$ 附近的值,比较不同精度下的结果差异。
(二)数值逼近1、多项式插值使用拉格朗日插值法和牛顿插值法对给定的数据点进行插值,得到拟合多项式,并分析其误差。
2、曲线拟合采用最小二乘法对给定的数据进行线性和非线性曲线拟合,如多项式曲线拟合和指数曲线拟合。
(三)数值积分1、牛顿柯特斯公式实现梯形公式、辛普森公式和柯特斯公式,计算给定函数在特定区间上的积分值,并分析误差。
2、高斯求积公式使用高斯勒让德求积公式计算积分,比较其精度与牛顿柯特斯公式的差异。
(四)数值微分利用差商公式计算函数的数值导数,分析步长对结果的影响,探讨如何选择合适的步长以提高精度。
三、实验步骤(一)误差分析1、定义函数`compute_sin_error` 来计算不同精度下的正弦函数值和误差。
```matlabfunction value, error = compute_sin_error(x, precision)true_value = sin(x);computed_value = vpa(sin(x), precision);error = abs(true_value computed_value);end```2、在主程序中调用该函数,分别设置不同的精度进行计算和分析。
(二)数值逼近1、拉格朗日插值法```matlabfunction L = lagrange_interpolation(x, y, xi)n = length(x);L = 0;for i = 1:nli = 1;for j = 1:nif j ~= ili = li (xi x(j))/(x(i) x(j));endendL = L + y(i) li;endend```2、牛顿插值法```matlabfunction N = newton_interpolation(x, y, xi)n = length(x);%计算差商表D = zeros(n, n);D(:, 1) = y';for j = 2:nfor i = j:nD(i, j) =(D(i, j 1) D(i 1, j 1))/(x(i) x(i j + 1));endend%计算插值结果N = D(1, 1);term = 1;for i = 2:nterm = term (xi x(i 1));N = N + D(i, i) term;endend```3、曲线拟合```matlab%线性最小二乘拟合p = polyfit(x, y, 1);y_fit_linear = polyval(p, x);%多项式曲线拟合p = polyfit(x, y, n);% n 为多项式的次数y_fit_poly = polyval(p, x);%指数曲线拟合p = fit(x, y, 'exp1');y_fit_exp = p(x);```(三)数值积分1、梯形公式```matlabfunction T = trapezoidal_rule(f, a, b, n)h =(b a) / n;x = a:h:b;y = f(x);T = h ((y(1) + y(end))/ 2 + sum(y(2:end 1)));end```2、辛普森公式```matlabfunction S = simpson_rule(f, a, b, n)if mod(n, 2) ~= 0error('n 必须为偶数');endh =(b a) / n;x = a:h:b;y = f(x);S = h / 3 (y(1) + 4 sum(y(2:2:end 1))+ 2 sum(y(3:2:end 2))+ y(end));end```3、柯特斯公式```matlabfunction C = cotes_rule(f, a, b, n)h =(b a) / n;x = a:h:b;y = f(x);w = 7, 32, 12, 32, 7 / 90;C = h sum(w y);end```4、高斯勒让德求积公式```matlabfunction G = gauss_legendre_integration(f, a, b)x, w = gauss_legendre(5);%选择适当的节点数t =(b a) / 2 x +(a + b) / 2;G =(b a) / 2 sum(w f(t));end```(四)数值微分```matlabfunction dydx = numerical_derivative(f, x, h)dydx =(f(x + h) f(x h))/(2 h);end```四、实验结果与分析(一)误差分析通过不同精度的计算,发现随着精度的提高,误差逐渐减小,但计算时间也相应增加。
数值分析在生活中的应用举例及Matlab实现
一、最小二乘法,用MATLAB实现1. 数值实例下面给定的是乌鲁木齐最近1个月早晨7:00左右(新疆时间)的天气预报所得到的温度,按照数据找出任意次曲线拟合方程和它的图像。
下面用MATLAB编程对上述数据进行最小二乘拟合。
下面用MATLAB编程对上述数据进行最小二乘拟合2、程序代码x=[1:1:30];y=[9,10,11,12,13,14,13,12,11,9,10,11,12,13,14,12,11,10,9,8,7,8,9,11,9,7,6,5,3,1];a1=polyfit(x,y,3) %三次多项式拟合%a2= polyfit(x,y,9) %九次多项式拟合%a3= polyfit(x,y,15) %十五次多项式拟合%b1=polyval(a1,x)b2=polyval(a2,x)b3=polyval(a3,x)r1= sum((y-b1).^2) %三次多项式误差平方和%r2= sum((y-b2).^2) %九次次多项式误差平方和%r3= sum((y-b3).^2) %十五次多项式误差平方和%plot(x,y,'*') %用*画出x,y图像%hold onplot(x,b1, 'r') %用红色线画出x,b1图像%hold onplot(x,b2, 'g') %用绿色线画出x,b2图像%hold onplot(x,b3, 'b:o') %用蓝色o线画出x,b3图像%3、数值结果不同次数多项式拟合误差平方和为:r1=67.6659r2=20.1060r3=3.7952r1、r2、r3分别表示三次、九次、十五次多项式误差平方和。
4、拟合曲线如下图二、 线性方程组的求解( 高斯-塞德尔迭代算法 )1、实例: 求解线性方程组(见书P233页)⎪⎪⎩⎪⎪⎨⎧=++=-+=+-3612363311420238321321321x x x x x x x x x 记A x=b, 其中⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=363320,,12361114238321b x A x x x任取初始值()()Tx0000=,进行迭代。
数值分析matlab数值试验
实验一:误差传播及算法稳定性实验1.21、试验程序:function charpt1_2% 误差传播及算法稳定性实验clc;clear all;promps={'请选择递推关系式,若选E1=1/e,En=1-nEn-1,请输入1,若选EN=0,En-1=(1-En)/n,请输入2:'};I=1;while Iresult=inputdlg(promps,'charpt1_2',1,{'1'});Nb=str2num(char(result));if ((Nb~=1)|(Nb~=2))I=0;endend%%%%%%%%%%%%%%%%%I=1;while Iresult=inputdlg('请输入递推步数 n>=1:','charpt1_2',1,{'10'});steps=str2num(char(result));if (steps>0)&(steps==fix(steps)) %% 如果steps大于0且为整数I=0;endend%%%%%%%%%%%%%%%%%result=inputdlg('请输入计算中所采用的有效数字位数n:','charpt1_2',1,{'5'});Sd=str2num(char(result));format long %% 设置显示精度result=zeros(1,steps); %% 存储计算结果err=result; %% 存储计算的绝对误差值func=result; %% 存储用quadl计算的近似值%%%%%%%%%%%%%%%%%%% 用quadl计算积分近似值for n=1:stepsfun=@(x) x.^n.*exp(x-1);func(n)= quadl(fun,0,1);end%%%%%%%%%%%%%%%%%%% 用自定义算法计算if(Nb==1)digits(Sd);result(1)=subs(vpa(1/exp(1)));for n=2:stepsresult(n)=subs(vpa(1-n*result(n-1)));enderr=abs(result-func);elseif(Nb==2)digits(Sd);result(steps)=0;for n=(steps-1):-1:1result(n)=subs(vpa((1-result(n+1))/(n+1)));enderr=abs(result-func);end%%%%%%%%%%%%%%%%%%% 输出结果数值及图像clf;disp('库函数计算值:');disp(sprintf('%e ',func));disp('递推值:');disp(sprintf('%e ',result));disp('误差值:');disp(sprintf('%e ',err));if(Nb==1)plot([1:steps],result,'-rs',[1:steps],func,':k*',[1:steps],err,'-.bo' );elseif(Nb==2)plot([steps:-1:1],result,'-rs',[steps:-1:1],func,':k*',[steps:-1:1],e rr,'-.bo');endxlabel('第n步');ylabel('计算值');legend('自定义算法结果','库函数计算结果','误差值');grid on2、试验结果:选择递推关系式1,递推步数为10,有效数字为5位,计算结果如下:库函数计算值:3.678794e-001 2.642411e-001 2.072766e-001 1.708934e-001 1.455329e-0011.268024e-001 1.123836e-001 1.009323e-001 9.161229e-002 8.387707e-002递推值:3.678800e-001 2.642400e-001 2.072800e-001 1.708800e-001 1.456000e-0011.264000e-001 1.152000e-001 7.840000e-0022.944000e-001 -1.944000e+000误差值:5.588280e-007 1.117662e-006 3.352927e-006 1.341222e-0056.705713e-005 4.023702e-004 2.816427e-003 2.253226e-002 2.027877e-001 2.027877e+00012345678910第n 步计算值选择递推关系式2,递推步数为10,有效数字为5位,计算结果如下: 库函数计算值:3.678794e-001 2.642411e-001 2.072766e-001 1.708934e-001 1.455329e-001 1.268024e-001 1.123836e-001 1.009323e-001 9.161229e-002 8.387707e-002 递推值:3.678800e-001 2.642400e-001 2.072800e-001 1.708900e-001 1.455300e-001 1.267900e-001 1.125000e-001 1.000000e-001 1.000000e-001 0.000000e+000 误差值:5.588280e-007 1.117662e-006 3.352927e-006 3.412224e-006 2.942873e-006 1.237016e-005 1.164270e-004 9.322618e-004 8.387707e-003 8.387707e-002第n 步计算值选择递推关系式1,递推步数为10,有效数字为6位,计算结果如下: 库函数计算值:3.678794e-001 2.642411e-001 2.072766e-001 1.708934e-001 1.455329e-001 1.268024e-001 1.123836e-001 1.009323e-001 9.161229e-002 8.387707e-002 递推值:3.678790e-001 2.642420e-001 2.072740e-001 1.709040e-001 1.454800e-001 1.271200e-001 1.101600e-001 1.187200e-001 -6.848000e-002 1.684800e+000 误差值:4.411720e-007 8.823378e-007 2.647073e-006 1.058778e-0055.294287e-005 3.176298e-004 2.223573e-003 1.778774e-002 1.600923e-001 1.600923e+00012345678910第n 步计算值选择递推关系式2,递推步数为10,有效数字为6位,计算结果如下: 库函数计算值:3.678794e-001 2.642411e-001 2.072766e-001 1.708934e-001 1.455329e-001 1.268024e-001 1.123836e-001 1.009323e-001 9.161229e-002 8.387707e-002 递推值:3.678800e-001 2.642410e-001 2.072770e-001 1.708930e-001 1.455360e-001 1.267860e-001 1.125000e-001 1.000000e-001 1.000000e-001 0.000000e+000 误差值:5.588280e-007 1.176622e-007 3.529274e-007 4.122239e-007 3.057127e-006 1.637016e-005 1.164270e-004 9.322618e-004 8.387707e-003 8.387707e-002第n 步计算值3、结果分析:很明显第二种递推式结果要比第一种好,式1在第七步后有明显误差,而式2在第三步后基本与近似解一致。
三种迭代法matlab程序 数值分析
•
end
• end
• err=abs(norm(X'-P));
• P=X';
• if(err<delta)
•
break
• end
• end
• X=X';
• err,k
function X=jacobi(A,b,P,delta,max1) %A是n维非奇异阵。%b是n维向量。%P是初值。%delta是误差界。 %max1是给定的迭代最高次数。%X为所求的方程组AX=b的近似解。 N=length(b); for k=1:max1 for j=1:N
X(j)=(b(j)-A(j,[1:j-1,j+1:N])*P([1:j-1,j+1:N]))/A(j,j); end err=abs(norm(X'-P)); P=X'; if(err<delta)
break end end X=X';k,erction X=gseid(A,b,P,delta,max1)
• %A是n维非奇异阵。%b是n维向量。%P是初值。
• %delta是误差界。%max1是给定的迭代最高次数。%X为所求的方程组AX=b的近似解。
• N=length(b);
• for k=1:max1
• for j=1:N
•
if j==1
•
X(1)=(b(1)-A(1,2:N)*P(2:N))/A(1,1);
•
elseif j==N
•
X(N)=(b(N)-A(N,1:N-1)*(X(1:N-1))')/A(N,N);
•
else
•
X(j)=(b(j)-A(j,1:j-1)*X(1:j-1)-A(j,j+1:N)*P(j+1:N))/A(j,j);
数值分析课程设计报告(MATLAB版)
(2)取右端向量 b 的三位有效数字得 b [1.83 1.08 0.783]T ,求方程组的准确 解 X ,并与 X 的数据 [1 1 1]T 作比较 。说明矩阵的病态性。
算法及相应结果: (1)在 MATLAB 命令窗口里输入如下命令: >> H=[1 1/2 1/3;1/2 1/3 1/4;1/3 1/4 1/5]; b=[11/6 13/12 47/60]'; >> x=H\b 回车得到结果为: x = 1.0000 1.0000 1.0000 (2)紧接着在上题基础上继续输入如下命令: >> c=[1.83 1.08 0.783]'; x1=H\c 回车得到如下结果: x1 = 1.0800 0.5400 1.4400
问题分析:考虑由直线段(2 个点)产生第一个图形(5 个点)的过程,设 P 1 和 P5 分别为原始直线段的两个端点。现在需要在直线段的中间依次插入三个点 。显然, P2 位于 P P2 , P3 , P4 产生第一次迭代的图形(图 1-4) 1 点右端直线段的三分 之一处, P4 点绕 P2 旋转 60 度(逆时针方向)而得到的,故可以处理为向量 P2 P4 经正交变换而得到向量 P2 P3 ,形成算法如下: (1) P2 P 1 (P 5 P 1) / 3 ; (2) P4 P 1 2( P 5 P 1) / 3 ; (3) P3 P2 ( P4 P2 ) AT ; 在算法的第三步中,A 为正交矩阵。
运行结果: 0.0884 0.0580 0.0431 0.0343 0.0285 0.0243 0.0212 0.0188 0.0169 0.0154 0.0141 0.0130 0.0120 0.0112 0.0105 0.0099 0.0094 0.0087 0.0092 0.0042 (2)从 I 30 较粗略的估计值出发,我们不妨取 0.01. 源程序:
数值分析各算法流程图
01,,n1,,n1,,)n x及数值分析各算法流程图一、插值1、 拉格朗日插值流程图:( 相应程序:lagrintp(x,y,xx))2,,n ,,j n 1,2,,n 1,,)n 2、 牛顿插值流程图(1)产生差商表的算法流程图(相应程序:divdiff(x,y))注:1、另一程序divdiff1(x,y),输出的矩阵包含了节点向量。
而divdiff(x,y)不含节点向量。
2、另一程序tableofdd(x,y,m),输出的是表格形式,添加了表头。
1,,),,n m 及1,,m (2)非等距节点的牛顿插值流程图(相应程序:newtint11(x,y,xx,m)) 、注:1、虽然程序newtint11(x,y,xx,m)考虑了多种情形,看上去很复杂,但基本流程结构还是如上图所示。
2、程序中调用的子程序是divdiff 。
若调用的子程序是divdiff1的话,流程图中的第三,第四,第五步要相应的改一下数字。
2,3,,1m +1,,j1,2,,n=1,2,,)n m 及(3)求差分表的流程图(相应程序:difference(y,m))注:1、difference 输出的是矩阵D 。
而另一程序tableofd(y,m),输出的是带有表头的差分表。
n x m1,,),,1,,m注:1、程序newtforward1(x,y,xx,m))的结构与上述流程图一致,xx可以是数组。
2、另一程序newtforward(x,y,xx,m))先求出插值多项式,再求插值多项式在插值点的函数值。
基本结构还是和上面的流程图一样。
n x m1,,),,-x x1,,m注:1、程序newtbackward1(x,y,xx,m))的结构与上述流程图一致,xx可以是数组。
2、另一程序newtbackward(x,y,xx,m))先求出插值多项式,再求插值多项式在插值点的函数值。
基本结构还是和上面的流程图一样。
1,2,,n1,2,,n ,2,,)n x及3、Hermite 插值流程图(1) 已知条件中一阶导数的个数与插值节点的个数相等时的Hermite 插值流程图。
同济大学数值分析matlab编程
同济⼤学数值分析matlab编程MATLAB 编程题库1.下⾯的数据表近似地满⾜函数21cx bax y ++=,请适当变换成为线性最⼩⼆乘问题,编程求最好的系数c b a ,,,并在同⼀个图上画出所有数据和函数图像.625.0718.0801.0823.0802.0687.0606.0356.0995.0628.0544.0008.0213.0362.0586.0931.0ii y x ----解:>> x=[-0.931 -0.586 -0.362 -0.213 0.008 0.544 0.628 0.995]'; >> y=[0.356 0.606 0.687 0.802 0.823 0.801 0.718 0.625]'; >> A= [x ones(8,1) -x.^2.*y]; >> z=A\y;>> a=z(1); b=z(2); c=z(3); >>xh=[-1:0.1:1]';>>yh=(a.*xh+b)./(1+c.*xh.^2); >>plot(x,y,'r+',xh,yh,'b*')2.若在Matlab ⼯作⽬录下已经有如下两个函数⽂件,写⼀个割线法程序,求出这两个函数精度为1010-的近似根,并写出调⽤⽅式:>> edit gexianfa.mfunction [x iter]=gexianfa(f,x0,x1,tol) iter=0;x=x1;while(abs(feval(f,x))>tol) iter=iter+1;x=x1-feval(f,x1).*(x1-x0)./(feval(f,x1)-feval(f,x0)); x0=x1;x1=x; end>> edit f.m function v=f(x) v=x.*log(x)-1;>> edit g.m function z=g(y) z=y.^5+y-1;>> [x1 iter1]=gexianfa('f',1,3,1e-10) x1 =1.7632 iter1 = 6>> [x2 iter2]=gexianfa('g',0,1,1e-10) x2 =0.7549 iter2 = 83.使⽤GS 迭代求解下述线性代数⽅程组:123123123521242103103x x x x x x x x x ì++=--++=í???-+=??解:>> edit gsdiedai.mfunction [x iter]=gsdiedai(A,x0,b,tol) D=diag(diag(A)); L=D-tril(A); U=D-triu(A); iter=0; x=x0;>> A=[5 2 1;-1 4 2;1 -3 10]; >> b=[-12 10 3]'; >>tol=1e-4; >>x0=[0 0 0]';>> [x iter]=gsdiedai(A,x0,b,tol); >>x x =-3.0910 1.2372 0.9802 >>iter iter = 64.⽤四阶Range-kutta ⽅法求解下述常微分⽅程初值问题(取步长h=0.01),(1)2x dy y e xy dx y ì??=++?í??=??解:>> edit ksf2.mfunction v=ksf2(x,y)v=y+exp(x)+x.*y; >> a=1;b=2;h=0.01; >> n=(b-a)./h; >> x=[1:0.01:2]; >>y(1)=2;>>for i=2:(n+1)k1=h*ksf2(x(i-1),y(i-1));k2=h*ksf2(x(i-1)+0.5*h,y(i-1)+0.5*k1); k3=h*ksf2(x(i-1)+0.5*h,y(i-1)+0.5*k2); k4=h*ksf2(x(i-1)+h,y(i-1)+k3); y(i)=y(i-1)+(k1+2*k2+2*k3+k4)./6; end >>y调⽤函数⽅法>> edit Rangekutta.mfunction [x y]=Rangekutta(f,a,b,h,y0) x=[a:h:b]; n=(b-a)/h; y(1)=y0; for i=2:(n+1)k1=h*(feval(f,x(i-1),y(i-1)));k2=h*(feval(f,x(i-1)+0.5*h,y(i-1)+0.5*k1)); k3=h*(feval(f,x(i-1)+0.5*h,y(i-1)+0.5*k2)); k4=h*(feval(f,x(i-1)+h,y(i-1)+k3)); y(i)=y(i-1)+ (k1+2*k2+2*k3+k4)./6; end>> [x y]=Rangekutta('ksf2',1,2,0.01,2); >>y5.取0.2h =,请编写Matlab 程序,分别⽤欧拉⽅法、改进欧拉⽅法在12x ≤≤上求解初值问题。
数值分析matlab方法插值法
其中,
n
【注】
x [a, b] w(x) (x x j ) j 0
(1)误差估计
Rn (x)
M n1 (n 1)!
w( x)
M n1
max
x( a ,b )
f
(n1) (x)
(2)余项与 x、M n1 节点的位置、个数 n 有关
(3)当 f (x)是 n 的多项式时Ln (x) f (x) n
M2 2!
(x
x0 )(x
x1 )
其中,
M2
max
x( x0 , x1 )
f
(x)
x
[
6
,
4
]
,所以
R1
(
5
24
)
sin
2!
4 (5
24
)( 5
6 24
)
4
0.0061
2)
抛物插值误差估计.因为
R2 (x)
M3 3!
(x
x0 )(x
x1)(x
x2 )
其中,
M3
max
x( x0 ,x2 )
f (x)
yiynewtonbackwardxyxicos035yi09394数值分析插值法55埃尔米特插值2n12n2数值分析插值法551埃尔米特插值多项式的存在唯一性2n1数值分析插值法数值分析插值法552埃尔米特插值余项553三次埃尔米特插值多项式maxsinxsin1数值分析插值法56561高次插值的病态性质0908原函数150706050405分段线性插值0302543214321055数值分析插值法562分段低次插值方法563分段低次插值余项090807060504030201090807060504030201543214321数值分析插值法57三次样条插值571三次样条插值572三弯矩法数值分析插值法573三次样条插值的误差估计与收敛性58插值运算的matlab函数581一维插值函数interp1yiinterp1xyximethod?linear?yiinterp1xyxilinear?1200135019
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
列主元法
function lianzhuyuan(A,b)
n=input('请输入n:') %选择阶数A=zeros(n,n); %系数矩阵A
b=zeros(n,1); %矩阵b
X=zeros(n,1); %解X
for i=1:n
for j=1:n
A(i,j)=(1/(i+j-1)); %生成hilbert矩阵A
end
b(i,1)=sum(A(i,:)); %生成矩阵b
end
for i=1:n-1
j=i;
top=max(abs(A(i:n,j))); %列主元
k=j;
while abs(A(k,j))~=top %列主元所在行
k=k+1;
end
for z=1:n %交换主元所在行a1=A(i,z);
A(i,z)=A(k,z);
A(k,z)=a1;
end
a2=b(i,1);
b(i,1)=b(k,1);
b(k,1)=a2;
for s=i+1:n %消去算法开始m=A(s,j)/A(i,j); %化简为上三角矩阵
A(s,j)=0;
for p=i+1:n
A(s,p)=A(s,p)-m*A(i,p);
end
b(s,1)=b(s,1)-m*b(i,1);
end
end
X(n,1)=b(n,1)/A(n,n); %回代开始
for i=n-1:-1:1
s=0; %初始化s
for j=i+1:n
s=s+A(i,j)*X(j,1);
end
X(i,1)=(b(i,1)-s)/A(i,i);
end
X
欧拉法
clc
clear
% 欧拉法
p=10; %贝塔的取值
T=10; %t取值的上限
y1=1; %y1的初值
r1=1; %y2的初值
%输入步长h的值
h=input('欧拉法please input number(h=1 0.5 0.25 0.125 0.0625):h=') ; if h>1 or h<0
break
end
S1=0:T/h;
S2=0:T/h;
S3=0:T/h;
S4=0:T/h;
i=1;
% 迭代过程
for t=0:h:T
Y=(exp(-t));
R=(1/(p-1))*exp(-t)+((p-2)/(p-1))*exp(-p*t);
y=y1+h*(-y1);
y1=y;
r=r1+h*(y1-p*r1);
r1=r;
S1(i)=Y;
S2(i)=R;
S3(i)=y;
S4(i)=r;
i=i+1;
end
t=[0:h:T];
% 红线为解析解,'x'为数值解
plot(t,S1,'r',t,S3,'x')
改进欧拉法
clc
clear
p=10; %贝塔的取值
T=10; %t取值的上限
y1=1; %y1的初值
r1=1; %y2的初值
%输入步长h的值
h=input('改进欧拉法please input number(h=1 0.5 0.25 0.125 0.0625):h=') ; if h>1 or h<0
break
end
S1=0:T/h;
S2=0:T/h;
S3=0:T/h;
S4=0:T/h;
i=1;
% 迭代过程
for t=0:h:T
Y=(exp(-t));
R=(1/(p-1))*exp(-t)+((p-2)/(p-1))*exp(-p*t);
k1=-y1;
l1=y1-p*r1;
k2=-(y1+h*k1);
l2=y1+h*k1-p*(r1+h*l1);
y=y1+h*(k1+k2)/2;
r=r1+h*(k1+k2)/2;
r1=r;
y1=y;
S1(i)=Y;
S2(i)=R;
S3(i)=y;
S4(i)=r;
i=i+1;
end
t=[0:h:T];
% 红线为解析解,'x'为数值解
plot(t,S1,'r',t,S3,'x')
高斯-赛德尔
function gaosisaideer
n=input('n='); %阶数
tol=input('tol='); %迭代精度
A=zeros(n,n);
b=zeros(n,1); %生成b向量
for i=1:n %给Hilbert矩阵和b向量赋值for j=1:n
A(i,j)=(1/(i+j-1));
end
b(i,1)=sum(A(i,:));
end
y=zeros(n,1); %迭代解
x1=zeros(n,1); %准确解
for i=1:n
y(i,1)=0; %迭代解赋初值
x1(i,1)=1; %生成准确解
end
k=0;
while norm(y-x1)>=tol %精度控制(采用自动步数控制) k=k+1;
for i=1:n %迭代开始
a1=0;
a2=0;
for j=1:i-1
a1=a1+A(i,j)*y(j,1);
end
for j=i+1:n
a2=a2+A(i,j)*y(j,1);
end
y(i,1)=(b(i,1)-a1-a2)/A(i,i);
end
end
disp('迭代步数k')
k
disp(y) %显示y
end
最速下降法
function gaosisaideer
n=input('阶数n='); %阶数
tol=input('迭代精度tol='); %迭代精度
eps=input('最速下降法eps=');
A=zeros(n,n);
b=zeros(n,1); %生成b向量
for i=1:n %给Hilbert矩阵和b向量赋值
for j=1:n
A(i,j)=(1/(i+j-1));
end
b(i,1)=sum(A(i,:));
end
y=zeros(n,1); %迭代解
x1=zeros(n,1); %准确解
t=zeros(n,1);
r=zeros(n,1);
for i=1:n
y(i,1)=0; %迭代解赋初值
x1(i,1)=1; %生成准确解
end
r=b-A*y;
while norm(r)>=eps; %先进行最速下降法求得进行赛德尔迭代的初始解y
t=(r'*r)/(r'*A*r);
s1=t*r;
y=y+s1;
r=b-A*y;
end
k=0;
while norm(y-x1)>=tol %精度控制(采用自动步数控制)
k=k+1;
for i=1:n %迭代开始
a1=0;
a2=0;
for j=1:i-1
a1=a1+A(i,j)*y(j,1);
end
for j=i+1:n
a2=a2+A(i,j)*y(j,1);
end
y(i,1)=(b(i,1)-a1-a2)/A(i,i);
end
end
disp('迭代步数k')
disp(k)
disp(y) %显示y
四阶龙格-库塔法
clc
clear
p=10; %贝塔的取值
T=10; %t取值的上限
y1=1; %y1的初值
r1=1; %y2的初值
%输入步长h的值
h=input('四阶龙格please input number(h=1 0.5 0.25 0.125 0.0625):h=') ; if h>1 or h<0
break
end
S1=0:T/h;
S2=0:T/h;
S3=0:T/h;
S4=0:T/h;
i=1;
% 迭代过程
for t=0:h:T
Y=(exp(-t));
R=(1/(p-1))*exp(-t)+((p-2)/(p-1))*exp(-p*t);
k1=-y1;
l1=y1-p*r1;
k2=-(y1+h*k1/2);
l2=y1+h*k1/2-p*(r1+h*l1/2);
k3=-(y1+h*k2/2);
l3=y1+h*k2/2-p*(r1+h*l2/2);
k4=-(y1+h*k3);
l4=y1+h*k3-p*(r1+h*l3);
y=y1+h*(k1+2*k2+2*k3+k4)/6;
r=r1+h*(l1+2*l2+2*l3+l4)/6;
r1=r;
y1=y;
S1(i)=Y;
S2(i)=R;
S3(i)=y;
S4(i)=r;
i=i+1;
end
t=[0:h:T];
% 红线为解析解,'x'为数值解plot(t,S1,'r',t,S3,'x')。