1、数值计算常见编程汇总20教材1. 秦九韶法利用秦九韶算法求多项式p(x)=x5-3x4+4x2-x+1在x=3时的值。x=input(请输入x:);n=input(请输入多项式最高幂数n:);a=input(请按照升幂顺序写出系数矩阵:);v0=a(n+1);for k=1:n v1=v0*x+a(n+1-k); v0=v1;endv=v0请输入x:3请输入多项式最高幂数n:5请按照升幂顺序写出系数矩阵:1 -1 4 0 -3 1v =342. 二分法用二分法求方程x3-x-1=0在1,2内的近似根,要求误差不超过10-3a=1;b=2;fa=a3-a-1;fb=b3-b-1;c=(a+b)/
2、2;fc=c3-c-1;if fa*fb0 ,break ,end while abs(fc)0.001 c=(a+b)/2; fc=c3-c-1; if fa*fc0; b=c; fb=fc; else a=c; fa=fc; endendformat longfx=fc, x=cfx = -4.659488331526518e-05x = 1.3247070312500003. 拉格朗日差值法:已知点(1 0)、(2 7)、(3 16)求x=4的值。x=input(以行向量形式输入x的取值);y=input(以行向量形式输入y的取值);n=input(多项式的次数);x1=input(计算
3、在x处的函数值,x1=);for k=1:(n+1) l(k)=1;endfor k=1:(n+1) for i=1:k-1 l(k)=l(k)*(x1-x(i)/(x(k)-x(i); end for i=(k+1):(n+1) l(k)=l(k)*(x1-x(i)/(x(k)-x(i); endendp=0;for k=1:n+1 p=p+l(k)*y(k);enddisp(p);以行向量形式输入x的取值1 2 3以行向量形式输入y的取值0 7 16多项式的次数2 计算在x处的函数值,x1=4274. 分段插值法:已知点(0 0.9)、(4 3.4)、(6 5.8)(8 8.9)(10 1
4、2)求x=7.5的值。x = 0 4 6 8 10;y = 0.9 3.4 5.8 8.9 12;n = length(x);x0=input(输入待求x0的值:);for i=1:n-1 if x0 x(n) disp(不符合条件,无法进行分段插值); break; end if x(i) = x0 & x0 x(i+1) f = y(i) + ( y(i+1) - y(i) / ( x(i+1)-x(i) ) * ( x0 - x(i) ); endendF输入待求x0的值:7.5f =8.12505. 牛顿差值已知点(2 3),(3 7),(5 9),(8 12)求x=7的值x0=2;x
5、1=3;x2=5;x3=8;y0=3;y1=7;y2=9;y3=12;x=7;f11=(y1-y0)/(x1-x0);f12=(y2-y0)/(x2-x0);f13=(y3-y0)/(x3-x0);f22=(f12-f11)/(x2-x1);f23=(f13-f11)/(x3-x1);f33=(f23-f22)/(x3-x2);N=y0+f11*(x-x0)+f22*(x-x1)*(x-x0)+f33*(x-x2)*(x-x1)*(x-x0);p=Np = 9.66676. 分段三次插值:已知:p(0)=0,p(1)=3,p(2)=12,p(3)=33,p,(0)=2,p,(1)=5,p,(2
6、)=14,p,(3)=29,用分段三次插值法求解p(1.2)clc;x=input(已知x的取值);y=input(已知y的取值);yy=input(已知y的一阶导数的取值);n=input(请输入x值的个数:);x0=input(x0的取值);y0=0;for i=1:n-1 if(x0x(n) disp(输入的值不在所给范围内); break; end if(x(i)=x0&x0x(i+1) h=x(i+1)-x(i); t=(x0-x(i)/h; y0=(t-1)2*(2*t+1)*y(i)+t2*(3-2*t)*y(i+1)+h*t*(t-1)2*yy(i)+h*t2*(t-1)*yy
7、(i+1); endenddisp(y0);已知x的取值0,1,2,3已知y的取值0,3,12,33已知y的一阶导数的取值2,5,14,29请输入x值的个数:4x0的取值1.2 4.12807. 牛顿插值公式已知:p(0)=0,p(1)=3,p(2)=12,p(3)=33, 用牛顿插值法求解p(1.2)clc;t=input(以行向量形式输入x的取值); y=input(以行向量形式输入y的取值);n=input(多项式的次数); x=input(计算在x处的函数值,x=);for k=2:(n+1)f(k)=0;endfor k=2:(n+1)for i=1:ku=1; for j=1:(i
8、-1)u=u*(t(i)-t(j); end for j=(i+1):ku=u*(t(i)-t(j);endf(k)=f(k)+y(i)/u; ,endendp=y(1);for k=2:(n+1)v=1;for i=1:(k-1) v=v*(x-t(i);end p=p+f(k)*v;enddisp(p);以行向量形式输入x的取值0,1,2,3;以行向量形式输入y的取值0,3,12,33多项式的次数3计算在x处的函数值,x=1.2 4.12808. 复化梯形积分公式已知f(x)=3x2+2*x,将区间0,3划分为3段,用复化梯形积分公式求函数f(x)在区间0,3积分。方法1clc;f=inp
9、ut(请输入函数形式,s);f=inline(f);a=input(积分下限a:);b=input(积分上限b:);n=input(需要划分的段数:);h=(b-a)/n;x(1)=a;x(n+1)=b;s=f(x(1)+f(x(n+1);for i=2:n x(i)=x(i-1)+h; s=s+2*f(x(i);ends=s*h/2;disp(s);请输入函数形式3*x2+2*x积分下限a:0积分上限b:3需要划分的段数:3 37.5000方法2 clc;a=input(积分下限a:);b=input(积分上限b:);n=input(需要划分的段数:);h=(b-a)/n;x(1)=a;x(
10、n+1)=b;for i=1:n+1 x(i)=x(1)+(i-1)*h; f(i)=3*x(i)2+2*x(i) ;ends=f(1)+f(n+1);for i=2:ns=s+2*f(i);ends=s*h/2;disp(s);积分下限a:0积分上限b:3需要划分的段数:3 37.50009. 复化辛普生积分公式已知f(x)=3x2+2*x,将区间0,3划分为3段,用复化辛普生积分公式求函数f(x)在区间0,3积分。方法1clc;f=input(请输入函数形式,s);f=inline(f);a=input(积分下限a:);b=input(积分上限b:);n=input(需要划分的段数:);h
11、=(b-a)/n;x(1)=a;x(n+1)=b;s=f(x(1)+f(x(n+1);for i=2:n x(i)=x(i-1)+h; s=s+4*f(x(i-1)+x(i)/2)+2*f(x(i);ends=s+4*f(x(n)+x(n+1)/2);s=s*h/6;disp(s);请输入函数形式3*x2+2*x积分下限a:0积分上限b:3需要划分的段数:336方法2clc;a=input(积分下限a:);b=input(积分上限b:);n=input(需要划分的段数:);h=(b-a)/n;x(1)=a;x(n+1)=b;for i=1:n+1 x(i)=x(1)+(i-1)*h; f(i)
12、=3*x(i)2+2*x(i) ;endfor i=1:n y(i)=(x(i)+x(i+1)/2 l(i)=3*y(i)2+2*y(i) ;end s= f(n+1)-f(1);for i=1:n s=s+4*l(i)+2*f(i);ends=s*h/6;disp(s);积分下限a:0积分上限b:3需要划分的段数:3 3610. 两点高斯公式已知f(x)=3x2+2*x,将区间0,3划分为3段,用两点高斯积分公式求函数f(x)在区间0,3积分。clc;f=input(请输入函数形式,s);f=inline(f);a=input(积分下限a:);b=input(积分上限b:);n=input(
13、需要划分的段数n:);h=(b-a)/n;t=2*30.5;x(1)=a;s=0;for i=2:n+1 x(i)=x(i-1)+h; c=(x(i)+x(i-1)/2; s=s+f(c-h/t)+f(c+h/t);ends=s*h/2;disp(s);请输入函数形式3*x2+2*x积分下限a:0积分上限b:3需要划分的段数n:3 3611. 复化高斯公式已知f(x)=3x2+2*x,将区间0,3划分为3段,用两点高斯积分公式求函数f(x)在区间0,3积分.程序clc;f=input(请输入函数形式,s);f=inline(f);a=input(积分下限a:);b=input(积分上限b:);
14、n=input(需要划分的段数n:);h=(b-a)/n;x(1)=a;x(n+1)=b;s=0;for i=2:nx(i)=x(i-1)+h;endfor k=1:ns=s+f(x(k)+h/2+h/(2*30.5)+f(x(k)+h/2-h/(2*30.5);ends=s*h/2;disp(s);程序运行结果:请输入函数形式3*x2+2*x积分下限a:0积分上限b:3需要划分的段数n:3 3612. 导数公式已知:p(0)=0,p(1)=3,p(2)=12 ,分别用向前求导、中点求导、向后求导求p,(0)、p,(1)、 p,(2)clc;x0=input(请输入x0的值:);y0=inpu
15、t(请输入y0的值:);x1=input(请输入x1的值:);y1=input(请输入y1的值:);x2=input(请输入x2的值:);y2=input(请输入y2的值:);h=input(请输入h步长的值:);f=(y1 y0)/h;g=(y2-y0)/(2*h);k=(y2-y1)/h;disp(f);disp(g);disp(k);请输入x0的值:0请输入y0的值:0请输入x1的值:1请输入y1的值:3请输入x2的值:2请输入y2的值:12请输入h步长的值:1 3 6 913. 一步欧拉方法已知:y=x+xy,y(0)=1,h=0.2,用一步欧拉方法求解y(0.8)方法1、clear
16、all;clc;f=input(请输入导数的函数形式,s);f=inline(f);x0=input(x0的初始值);y0=input(y0的初始值);h=input(步长);x=input(x的值);while(x0x) x1=x0+h; y1=y0+h*f(x0,y0); x0=x1; y0=y1;enddisp(y0);请输入导数的函数形式x+x*yx0的初始值0y0的初始值1步长0.2x的值0.8 1.5160方法2、clear all;clc;x1=input(x1的初始值:);y1=input(y1的初始值:);h=input(步长:);x=input(x的值:);n=(x-x1)
17、/h;for i=1:n+1y(i)=1end for i=1:n x(i)=x1+(i-1)*h; y(i+1)=y(i)+h*(x(i)+x(i)*y(i); enddisp(y(5)x1的初始值:0y1的初始值:1步长:0.2x的值:0.8 1.516014. 二步欧拉方法已知:y=x+xy,y(0)=1,h=0.2,用二步欧拉方法求解y(0.8)方法1clear all;clc;f=input(请输入导数的函数形式,s);f=inline(f);x0=input(x0的初始值:);y0=input(y0的初始值:);h=input(步长h:);x=input(x的值:);x1=x0+h
18、;y1=y0+h*f(x0,y0);while(x1x) x2=x1+h; y2=y0+2*h*f(x1,y1); y0=y1;y1=y2; x0=x1;x1=x2;enddisp(y1);请输入导数的函数形式x+x*yx0的初始值:0y0的初始值:1步长h:0.2x的值:0.8 1.7229方法2:clear all;clc;x0=input(x0的初始值:);y0=input(y0的初始值:);h=input(步长h:);x=input(x的值:);n=(x-x0)/h;for i=1:n+1 y(i)=1;endy(2)=y0+h*(x0+x0*y0);for i=1:n-1 x(i+1
19、)=x0+i*h; y(i+2)=y(i)+2*h*(x(i+1)+x(i+1)*y(i+1);enddisp(y(5)x0的初始值:0y0的初始值:1步长h:0.2x的值:0.8 1.7229 15. 隐式欧拉方法及其改进方法已知:y=x+xy,y(0)=1,h=0.2,用二步欧拉方法求解y(0.8)clear all;clc;f=input(请输入导数的函数形式,s);f=inline(f);x0=input(x0的初始值:);y0=input(y0的初始值:);h=input(步长h:);xn=input(终值:);while(x0esp)x2=f(x1);x0=x1;x1=x2;end
20、format short ex1程序运行结果:x1 = 1.6892e-01方法2clear all;clc;n=input(请输入迭代次数:)x0=0;for i=1:nx1=0.2*exp(-x0);x0=x1;endformat short ex0请输入迭代次数:5x0 = 1.6894e-0118. 雅克比迭代法用雅克比迭代法求解方程a=input(输入加工后方程组的系数矩阵a);b=input(输入加工后b的取值);x=input(输入方程组的解的迭代初值);n=numel(b);N=input(输入迭代的次数);for i=1:N for j=1:n t(j)=b(j); for
21、k=1:n t(j)=t(j)+a(j,k)*x(k); end end x=t;enddisp(x);输入加工后方程组的系数矩阵a0 0 -0.1 0.5;-1/8 0 3/8 0;3/8 1/4 0 1/8;-1/7 2/7 -2/7 0输入加工后b的取值-0.7 11/8 -23/8 17/7输入方程组的解的迭代初值0 0 0 0输入迭代的次数15 1.0000 0.5000 -2.0000 3.000019. 高斯-塞德尔迭代法用高斯-赛德尔迭代法求解方程clear all;clc;a=input(输入加工后方程组的系数矩阵a);b=input(输入加工后b的取值);x=input(输
22、入方程组的解的迭代初值);n=numel(b);N=input(输入迭代的次数);for i=1:N for j=1:n x(j)=b(j); for k=1:n x(j)=x(j)+a(j,k)*x(k); end endenddisp(x);输入加工后方程组的系数矩阵a0 0 -0.1 0.5;-1/8 0 3/8 0;3/8 1/4 0 1/8;-1/7 2/7 -2/7 0输入加工后b的取值-0.7 11/8 -23/8 17/7输入方程组的解的迭代初值0 0 0 0输入迭代的次数10 1.0000 0.5000 -2.0000 3.000020. 追赶法用追赶法求解方程clear a
23、ll;clear all;a=input(输入方程组的系数a);b=input(输入方程组的系数 b);c=input(输入方程组的系数c);f=input(输入方程组的系数 f);n=input(输入方程组的未知数个数);u(1)=c(1)/b(1);y(1)=f(1)/b(1);for k=2:n u(k)=c(k)/(b(k)-u(k-1)*a(k); y(k)=(f(k)-y(k-1)*a(k)/(b(k)-u(k-1)*a(k);endx(n)=y(n);for i=1:n-1 x(n-i)=y(n-i)-u(n-i)*x(n-i+1);enddisp(x)输入方程组的系数a0 -1 -1 -3输入方程组的系数 b2 3 2 5输入方程组的系数c-1 -2 -4 0输入方程组的系数 f6 1 0 1输入方程组的未知数个数4 3 0 -2 -1
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1