您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 数值计算常见编程汇总(20)
1.秦九韶法利用秦九韶算法求多项式p(x)=x^5-3x^4+4x^2-x+1在x=3时的值。x=input('请输入x:');n=input('请输入多项式最高幂数n:');a=input('请按照升幂顺序写出系数矩阵:');v0=a(n+1);fork=1:nv1=v0*x+a(n+1-k);v0=v1;endv=v0请输入x:3请输入多项式最高幂数n:5请按照升幂顺序写出系数矩阵:[1-140-31]v=342.二分法用二分法求方程x^3-x-1=0在[1,2]内的近似根,要求误差不超过10-3a=1;b=2;fa=a^3-a-1;fb=b^3-b-1;c=(a+b)/2;fc=c^3-c-1;iffa*fb0,break,endwhileabs(fc)0.001c=(a+b)/2;fc=c^3-c-1;iffa*fc0;b=c;fb=fc;elsea=c;fa=fc;endendformatlongfx=fc,x=cfx=-4.659488331526518e-05x=1.3247070312500003.拉格朗日差值法:已知点(10)、(27)、(316)求x=4的值。x=input('以行向量形式输入x的取值');y=input('以行向量形式输入y的取值');n=input('多项式的次数');x1=input('计算在x处的函数值,x1=');fork=1:(n+1)l(k)=1;endfork=1:(n+1)fori=1:k-1l(k)=l(k)*(x1-x(i))/(x(k)-x(i));endfori=(k+1):(n+1)l(k)=l(k)*(x1-x(i))/(x(k)-x(i));endendp=0;fork=1:n+1p=p+l(k)*y(k);enddisp(p);以行向量形式输入x的取值[123]以行向量形式输入y的取值[0716]多项式的次数2计算在x处的函数值,x1=4274.分段插值法:已知点(00.9)、(43.4)、(65.8)(88.9)(1012)求x=7.5的值。x=[046810];y=[0.93.45.88.912];n=length(x);x0=input('输入待求x0的值:');fori=1:n-1ifx0x(1)||x0x(n)disp('不符合条件,无法进行分段插值');break;endifx(i)=x0&&x0x(i+1)f=y(i)+(y(i+1)-y(i))/(x(i+1)-x(i))*(x0-x(i));endendF输入待求x0的值:7.5f=8.12505.牛顿差值已知点(23),(37),(59),(812)求x=7的值x0=2;x1=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)=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;fori=1:n-1if(x0x(1)||x0x(n))disp('输入的值不在所给范围内');break;endif(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)+t^2*(3-2*t)*y(i+1)+h*t*(t-1)^2*yy(i)+h*t^2*(t-1)*yy(i+1);endenddisp(y0);已知x的取值[0,1,2,3]已知y的取值[0,3,12,33]已知y的一阶导数的取值[2,5,14,29]请输入x值的个数:4x0的取值1.24.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=');fork=2:(n+1)f(k)=0;endfork=2:(n+1)fori=1:ku=1;forj=1:(i-1)u=u*(t(i)-t(j));endforj=(i+1):ku=u*(t(i)-t(j));endf(k)=f(k)+y(i)/u;,,endendp=y(1);fork=2:(n+1)v=1;fori=1:(k-1)v=v*(x-t(i));endp=p+f(k)*v;enddisp(p);以行向量形式输入x的取值[0,1,2,3];以行向量形式输入y的取值[0,3,12,33]多项式的次数3计算在x处的函数值,x=1.24.12808.复化梯形积分公式已知f(x)=3x^2+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=(b-a)/n;x(1)=a;x(n+1)=b;s=f(x(1))+f(x(n+1));fori=2:nx(i)=x(i-1)+h;s=s+2*f(x(i));ends=s*h/2;disp(s);请输入函数形式3*x^2+2*x积分下限a:0积分上限b:3需要划分的段数:337.5000方法2clc;a=input('积分下限a:');b=input('积分上限b:');n=input('需要划分的段数:');h=(b-a)/n;x(1)=a;x(n+1)=b;fori=1:n+1x(i)=x(1)+(i-1)*h;f(i)=3*x(i)^2+2*x(i);ends=f(1)+f(n+1);fori=2:ns=s+2*f(i);ends=s*h/2;disp(s);积分下限a:0积分上限b:3需要划分的段数:337.50009.复化辛普生积分公式已知f(x)=3x^2+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=(b-a)/n;x(1)=a;x(n+1)=b;s=f(x(1))+f(x(n+1));fori=2:nx(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*x^2+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;fori=1:n+1x(i)=x(1)+(i-1)*h;f(i)=3*x(i)^2+2*x(i);endfori=1:ny(i)=(x(i)+x(i+1))/2l(i)=3*y(i)^2+2*y(i);ends=f(n+1)-f(1);fori=1:ns=s+4*l(i)+2*f(i);ends=s*h/6;disp(s);积分下限a:0积分上限b:3需要划分的段数:33610.两点高斯公式已知f(x)=3x^2+2*x,将区间[0,3]划分为3段,用两点高斯积分公式求函数f(x)在区间[0,3]积分。clc;f=input('请输入函数形式','s');f=inline(f);a=input('积分下限a:');b=input('积分上限b:');n=input('需要划分的段数n:');h=(b-a)/n;t=2*3^0.5;x(1)=a;s=0;fori=2:n+1x(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*x^2+2*x积分下限a:0积分上限b:3需要划分的段数n:33611.复化高斯公式已知f(x)=3x^2+2*x,将区间[0,3]划分为3段,用两点高斯积分公式求函数f(x)在区间[0,3]积分.程序clc;f=input('请输入函数形式','s');f=inline(f);a=input('积分下限a:');b=input('积分上限b:');n=input('需要划分的段数n:');h=(b-a)/n;x(1)=a;x(n+1)=b;s=0;fori=2:nx(i)=x(i-1)+h;endfork=1:ns=s+f(x(k)+h/2+h/(2*3^0.5))+f(x(k)+h/2-h/(2*3^0.5));ends=s*h/2;disp(s);程序运行结果:请输入函数形式3*x^2+2*x积分下限a:0积分上限b:3需要划分的段数n:33612.导数公式已知:p(0)=0,p(1)=3,p(2)=12,分别用向前求导、中点求导、向后求导求p,(0)、p,(1)、p,(2)clc;x0=input('请输入x0的值:');y0=input('请输入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步长的值:136913.一步欧拉方法已知:y’=x+xy,y(0)=1,h=0.2,用一步欧拉方法求解y(0.8)方法1、clearall;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.81.5160方法2、clearall;clc;x1=input('x1的初始值:');y1=input('y1的初始值:');h=input('步长:');x=input('x的值:');n=(x-x1)/h;fori=1:n+1y(i)=1endfori=1:nx(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.81.516014.二步欧拉方法已知:y’=x+xy,y(0)=1,h=0.2,用二步欧拉方法求解
本文标题:数值计算常见编程汇总(20)
链接地址:https://www.777doc.com/doc-2387560 .html