数值分析上机实验报告

合集下载

数值分析报告上机报告材料

数值分析报告上机报告材料

第一题:1、已知A 与b12.38412 2.115237 -1.061074 1.112336 -0.1135840.718719 1.742382 3.067813 -2.031743 2.11523719.141823 -3.125432 -1.012345 2.189736 1.563849-0.784165 1.112348 3.123124 -1.061074 -3.125A =43215.567914 3.123848 2.031454 1.836742-1.056781 0.336993 -1.010103 1.112336 -1.012345 3.12384827.108437 4.101011-3.741856 2.101023 -0.71828 -0.037585 -0.1135842.189736 2.031454 4.10101119.8979180.431637-3.111223 2.121314 1.784317 0.718719 1.563849 1.836742 -3.741856 0.4316379.789365-0.103458 -1.103456 0.238417 1.742382 -0.784165 -1.056781 2.101023-3.111223-0.10345814.7138465 3.123789 -2.213474 3.067813 1.112348 0.336993-0.71828 2.121314-1.103456 3.12378930.719334 4.446782 -2.031743 3.123124 -1.010103-0.037585 1.7843170.238417-2.213474 4.44678240.00001[ 2.1874369 33.992318 -25.173417 0.84671695 1.784317 -86.612343 1.1101230 4.719345 -5.6784392]TB ⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦=(1)用Househloser 变换,把A 化为三对角阵(并打印B )。

数值分析上机实验报告

数值分析上机实验报告

数值分析上机实验理学院11级统计01班41108030125鲁庆实验报告一一.实验名称误差与误差估计二.实验目的掌握数值运算的误差估计方法三.数学原理 1.绝对误差(*)e x设某一量的准确值为x ,近似值为x*,则x*与x 之差叫做近似值x*的绝对误差(简称误差),记为*(*)*e e x x x ==- 2.绝对误差限适当小的正数,使|(*)||*|*e x x x ε=-≤则称*ε为近似值 x * 的绝对误差限。

(有时用*x x ε*=±表示近似值x *的精度或准确值的所在范围。

3.相对误差(*)r e x绝对误差与准确值之比*(*)*(*),0r r e x x xe e x x x x-===≠称为x *的相对 误差。

4.相对误差限(*)r x ε若指定一个适当小的正数 (*)r x ε,使|(*)||(*)|(*)||r r e x e x x x ε=≤则称(*)r x ε为近似值 x *的相对误差限。

5.有效数字若近似值x*的绝对误差限是某一位的半个单位,该位到x*的第一位非零数字一共有n 位,则称近似值x*有n 位有效数字,或说x*精确到该位。

6.绝对误差的运算:)()()(2121x x x x εεε+=± )()()(122121x x x x x x εεε+≈22122121+=x x x x x x x )()()(εεε (f(x))()(x)f x εε'≈四.实验内容1. 计算I n=e 1-⎰10nxe x 2dx (n=0,1,...)并估计误差。

解: >> I0 = exp(-1)*quad('(x.^0).*exp(x.^2)',0,1,10^(-10));>> vpa(I0,10) ans =.5380795069>> I1= exp(-1)*quad('(x.^1).*exp(x.^2)',0,1,10^(-10)); >> vpa(I1,10) ans =.3160602794>> I2 = exp(-1)*quad('(x.^2).*exp(x.^2)',0,1,10^(-10)); >> vpa(I2,10) ans =.2309602465>> I3 = exp(-1)*quad('(x.^3).*exp(x.^2)',0,1,10^(-10)); >> vpa(I3,10) ans =.1839397206>> I4 = exp(-1)*quad('(x.^4).*exp(x.^2)',0,1,10^(-10)); >> vpa(I4,10) ans =.1535596302>> I5 = exp(-1)*quad('(x.^5).*exp(x.^2)',0,1,10^(-10)); >> vpa(I5,10) ans =.1321205588>> I6 = exp(-1)*quad('(x.^6).*exp(x.^2)',0,1,10^(-10)); >> vpa(I6,10) ans =.1161009245>> I7 = exp(-1)*quad('(x.^7).*exp(x.^2)',0,1,10^(-10)); >> vpa(I7,10) ans =.1036383235>> I8 = exp(-1)*quad('(x.^8).*exp(x.^2)',0,1,10^(-10)); >> vpa(I8,10) ans =.9364676413e-1>> I9 = exp(-1)*quad('(x.^9).*exp(x.^2)',0,1,10^(-10)); >> vpa(I9,10) ans =.8544670595e-1 2.计算x255的值。

数值分析实验报告

数值分析实验报告

数值分析实验报告篇一:数值分析实验报告(一)(完整)数值分析实验报告12345篇二:数值分析实验报告数值分析实验报告课题一:解线性方程组的直接方法1.实验目的:1、通过该课题的实验,体会模块化结构程序设计方法的优点;2、运用所学的计算方法,解决各类线性方程组的直接算法;3、提高分析和解决问题的能力,做到学以致用;4、通过三对角形线性方程组的解法,体会稀疏线性方程组解法的特点。

2.实验过程:实验代码:#include "stdio.h"#include "math.h"#includeiostreamusing namespace std;//Gauss法void lzy(double **a,double *b,int n) {int i,j,k;double l,x[10],temp;for(k=0;kn-1;k++){for(j=k,i=k;jn;j++){if(j==k)temp=fabs(a[j][k]);else if(tempfabs(a[j][k])){temp=fabs(a[j][k]);i=j;}}if(temp==0){cout"无解\n; return;}else{for(j=k;jn;j++){temp=a[k][j];a[k][j]=a[i][j];a[i][j]=temp;}temp=b[k];b[k]=b[i];b[i]=temp;}for(i=k+1;in;i++) {l=a[i][k]/a[k][k];for(j=k;jn;j++)a[i][j]=a[i][j]-l*a[k][j]; b[i]=b[i]-l*b[k];}if(a[n-1][n-1]==0){cout"无解\n;return;}x[n-1]=b[n-1]/a[n-1][n-1];for(i=n-2;i=0;i--){temp=0;for(j=i+1;jn;j++)temp=temp+a[i][j]*x[j];x[i]=(b[i]-temp)/a[i][i];}for(i=0;in;i++){printf("x%d=%lf\t",i+1,x[i]); printf("\n");}}//平方根法void pfg(double **a,double *b,int n)int i,k,m;double x[8],y[8],temp;for(k=0;kn;k++){temp=0;for(m=0;mk;m++)temp=temp+pow(a[k][m],2);if(a[k][k]temp)return;a[k][k]=pow((a[k][k]-temp),1.0/2.0);for(i=k+1;in;i++){temp=0;for(m=0;mk;m++)temp=temp+a[i][m]*a[k][m]; a[i][k]=(a[i][k]-temp)/a[k][k]; }temp=0;for(m=0;mk;m++)temp=temp+a[k][m]*y[m];y[k]=(b[k]-temp)/a[k][k];}x[n-1]=y[n-1]/a[n-1][n-1];for(k=n-2;k=0;k--){temp=0;for(m=k+1;mn;m++)temp=temp+a[m][k]*x[m];x[k]=(y[k]-temp)/a[k][k];}for(i=0;in;i++){printf("x%d=%lf\t",i+1,x[i]);printf("\n");}}//追赶法void zgf(double **a,double *b,int n){int i;double a0[10],c[10],d[10],a1[10],b1[10],x[10],y[10]; for(i=0;in;i++){a0[i]=a[i][i];if(in-1)c[i]=a[i][i+1];if(i0)d[i-1]=a[i][i-1];}a1[0]=a0[0];for(i=0;in-1;i++){b1[i]=c[i]/a1[i];a1[i+1]=a0[i+1]-d[i+1]*b1[i];}y[0]=b[0]/a1[0];for(i=1;in;i++)y[i]=(b[i]-d[i]*y[i-1])/a1[i];x[n-1]=y[n-1];for(i=n-2;i=0;i--)x[i]=y[i]-b1[i]*x[i+1];for(i=0;in;i++){printf("x%d=%lf\t",i+1,x[i]); printf("\n");}}int main(){int n,i,j;double **A,**B,**C,*B1,*B2,*B3;A=(double **)malloc(n*sizeof(double)); B=(double **)malloc(n*sizeof(double));C=(double **)malloc(n*sizeof(double));B1=(double *)malloc(n*sizeof(double));B2=(double *)malloc(n*sizeof(double));B3=(double *)malloc(n*sizeof(double));for(i=0;in;i++){A[i]=(double *)malloc((n)*sizeof(double));B[i]=(double*)malloc((n)*sizeof(double));C[i]=(double*)malloc((n)*sizeof(double)); }cout"第一题(Gauss列主元消去法):"endlendl; cout"请输入阶数n:"endl;cinn;cout"\n请输入系数矩阵:\n\n";for(i=0;in;i++)for(j=0;jn;j++){篇三:数值分析实验报告(包含源程序) 课程实验报告课程实验报告。

数值分析实验报告5篇

数值分析实验报告5篇
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -13 -14
1.69376699767424 0.92310666706964 0.08471614569741 0.40804026409411
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
讨论:
利用这种方法进行这类实验,可以很精确的扰动敏感性的一般规律。即 当对扰动项的系数越来越小时,对其多项式扰动的结果也就越来越小, 即扰动敏感性与扰动项的系数成正比,扰动项的系数越大,对其根的扰 动敏感性就越明显,当扰动的系数一定时,扰动敏感性与扰动的项的幂 数成正比,扰动的项的幂数越高,对其根的扰动敏感性就越明显。
解线性方程组的直接方法
实验 (主元的选取与算法的稳定性) 问题提出:Gauss消去法是我们在线性代数中已经熟悉的。但由于计算 机的数值运算是在一个有限的浮点数集合上进行的,如何才能确保 Gauss消去法作为数值算法的稳定性呢?Gauss消去法从理论算法到数值 算法,其关键是主元的选择。主元的选择从数学理论上看起来平凡,它 却是数值分析中十分典型的问题。 实验内容:考虑线性方程组 编制一个能自动选取主元,又能手动选取主元的求解线性方程组的 Gauss消去过程。 实验要求: (1)取矩阵,则方程有解。取n=10计算矩阵的条件数。让程序自动选 取主元,结果如何? (2)现选择程序中手动选取主元的功能。每步消去过程总选取按模最 小或按模尽可能小的元素作为主元,观察并记录计算结果。若每步消去 过程总选取按模最大的元素作为主元,结果又如何?分析实验的结果。 (3)取矩阵阶数n=20或者更大,重复上述实验过程,观察记录并分析 不同的问题及消去过程中选择不同的主元时计算结果的差异,说明主元

数值分析实验报告模板

数值分析实验报告模板

数值分析实验报告模板篇一:数值分析实验报告(一)(完整)数值分析实验报告12345篇二:数值分析实验报告实验报告一题目:非线性方程求解摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。

本实验采用两种常见的求解方法二分法和Newton法及改进的Newton法。

利用二分法求解给定非线性方程的根,在给定的范围内,假设f(x,y)在[a,b]上连续,f(a)xf(b) 直接影响迭代的次数甚至迭代的收敛与发散。

即若x0 偏离所求根较远,Newton法可能发散的结论。

并且本实验中还利用利用改进的Newton法求解同样的方程,且将结果与Newton法的结果比较分析。

前言:(目的和意义)掌握二分法与Newton法的基本原理和应用。

掌握二分法的原理,验证二分法,在选对有根区间的前提下,必是收敛,但精度不够。

熟悉Matlab语言编程,学习编程要点。

体会Newton使用时的优点,和局部收敛性,而在初值选取不当时,会发散。

数学原理:对于一个非线性方程的数值解法很多。

在此介绍两种最常见的方法:二分法和Newton法。

对于二分法,其数学实质就是说对于给定的待求解的方程f(x),其在[a,b]上连续,f(a)f(b) Newton法通常预先要给出一个猜测初值x0,然后根据其迭代公式xk?1?xk?f(xk) f'(xk)产生逼近解x*的迭代数列{xk},这就是Newton法的思想。

当x0接近x*时收敛很快,但是当x0选择不好时,可能会发散,因此初值的选取很重要。

另外,若将该迭代公式改进为xk?1?xk?rf(xk) 'f(xk)其中r为要求的方程的根的重数,这就是改进的Newton 法,当求解已知重数的方程的根时,在同种条件下其收敛速度要比Newton法快的多。

程序设计:本实验采用Matlab的M文件编写。

其中待求解的方程写成function的方式,如下function y=f(x);y=-x*x-sin(x);写成如上形式即可,下面给出主程序。

数值分析实验报告线性插值和二次插值计算ln0.54的近似值

数值分析实验报告线性插值和二次插值计算ln0.54的近似值

数值分析实验报告线性‎插值和二次插值计算l‎n0.54的近似值‎数值分析实验报告线性‎插值和二次插值计算l‎n0.54的近似值‎‎篇一:‎数值分析-用线性‎插值及二次插值计算‎数值分析上机报告习‎题:给出f(‎x)?lnx的数值表‎,用线性插值及二次插‎值计算ln0.54的‎近似值。

解:‎(1)用线‎性插值计算 Matl‎a b程序 x=0.‎54; a=[0.‎5,0.6];b‎=[-0.69314‎7,-0.51082‎6]; l1=b‎ (1)*((x-‎a(2))/(‎a(1)-a‎ (2))); ‎l2=b(2)‎*((x-a(‎1))/(a(‎2)-a(1)‎)); y=l1+‎l2 y = -0.‎6202(2‎)用抛物插值计算 M‎a tlab程序 x‎=0.54; a=‎[0.4,0.5,0‎.6]; b=[-‎0.916291,-‎0.693147,-‎0.510826];‎ A=b(1‎)*(x-a(‎2))*(x-a‎(3))/((a‎ (1)-a‎(2))*(a‎(1)-a(3‎))); B=b‎(2)*(x-a‎ (1))*(x-‎a(3))/(‎(a(2)-a‎(1))*(a‎(2)-a‎(3))); C=‎b(3)*(x‎-a(1))*‎(x-a(2)‎)/((a(3‎)-a(1))‎*(a(3)-‎a(2)));‎y=A+B+C y‎= -0.6153‎‎篇二:‎数值分‎析上机实验报告二实‎验报告二题目:‎如何求解插值函数‎摘要:在工‎程测量和科学实验中,‎所得到的数据通常都是‎离散的,如果要得到这‎些离散点意外的其他点‎的数值,就需要根据这‎些已知数据进行插值。

‎这里我们将采用多种插‎值方法。

前言:‎(目的和意义)‎掌握Lagrange‎,Netn,Herm‎i te,线性,三次样‎条插值法的原理及应用‎,并能求解相应问题。

‎数学原理:‎主要的插值法有:‎多项式插值法、‎拉格朗日插值法、线性‎插值法、牛顿插值法,‎H ermite插值法‎三次样条插值法等。

数值分析上机实习报告

数值分析上机实习报告

数值分析上机实习报告目录1.问题一 (1)问题一重述 (1)秦九韶算法简介 (1)问题一算法实现 (1)问题一求解 (1)2.问题二 (2)问题二重述 (2)逐次超松弛迭代法(SOR法)简介 (2)问题二算法实现 (3)问题二求解 (3)3.问题三 (4)问题三重述 (4)最小二乘拟合多项式与拉格朗日插值多项式简介 (4)3.2.1最小二乘拟合多项式简介 (4)3.2.2拉格朗日插值简介 (5)问题三算法实现 (5)3.3.1多项式拟合算法 (5)3.3.2拉格朗日插值算法 (6)问题三求解 (6)3.4.1最小二乘多项式拟合结果 (6)3.4.2拉格朗日插值结果 (8)问题三评判 (9)3.5.1问题三评判方式 (9)3.5.2问题三评判结果 (9)4.总结与体会 (10)5.附录 (11)1. 问题一问题一重述利用秦九韶算法简化求多项式1110n n n n x a x a y x a a --=++++的值的运算式,并写程序计算多项式42352x y x x =--+在1x =-点处的值。

秦九韶算法简介121210...n n n n y a x a x a x a x a --=+++++化为以下形式:1210(...(())...)n n n y a x a x a x a x a --=+++++求多项式值时先计算内层括号内的一次多项式的值,然后由内向外逐层计算一次多项式的值,即:11n n v a x a -=+212n v v x a -=+ …1k k n k v v x a +-=+…10n n v v x a -=+ 问题一算法实现Step1:输入多项式的降次排列的系数矩阵,某次缺失的系数用零补充之;Step2:计算表达式1v ,按递推1k k n k v v x a +-=+公式,一直计算到表达式n v ,表达式n v 即为所求秦九韶表达式;Step3:输入x 的值;Step4:计算1v ,按递推1k k n k v v x a +-=+公式,一直计算到n v 的值,n v 的值即为x 处多项式的值。

数值分析实验报告三

数值分析实验报告三
plot(x,y)
grid
[k,x,wuca,yx]=erfen (﹣1,1,10^-5)
2)运行结果
ans =
0 -1.0000 1.0000 0 1.0000 -11.6321 10.7183 -1.0000
ans =
1.0000 0 1.0000 0.5000 0.5000 -1.0000 10.7183 4.6487
ans =
11.0000 0.0898 0.0908 0.0903 0.0005 -0.0076 0.0033 -0.0021
ans =
12.0000 0.0903 0.0908 0.0906 0.0002 -0.0021 0.0033 0.0006
ans =
13.0000 0.0903 0.0906 0.0905 0.0001 -0.0021 0.0006 -0.0008
ans =
7.0000 0.1256 0.0008 0.0033 0.0262
ans =
8.0000 0.1240 0.0002 0.0016 0.0129
ans =
9.0000 0.1233 0.0000 0.0007 0.0056
ans =
9.0000 0.1233 0.0000 0.0007 0.0056
(2)、Use the iteration method ,the initial value .
2、The equation has two roots near 0.1.
Determine them by means ofNewton’s method.
(with accuracy )
3、用迭代法求方程 附近的一个根。方程写成下
k = 9
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数值分析上机实验报告《数值分析》上机实验报告1.用Newton 法求方程 X 7-X 4+14=0在(0.1,1.9)中的近似根(初始近似值取为区间端点,迭代6次或误差小于0.00001)。

1.1 理论依据:设函数在有限区间[a ,b]上二阶导数存在,且满足条件{}αϕ上的惟一解在区间平方收敛于方程所生的迭代序列迭代过程由则对任意初始近似值达到的一个中使是其中上不变号在区间],[0)(3,2,1,0,)(')()(],,[x |))(),((|,|,)(||)(|.4;0)(.3],[)(.20)()(.110......b a x f x k x f x f x x x Newton b a b f a f mir b a c x f ab c f x f b a x f b f x f k k k k k k ==-==∈≤-≠>+令)9.1()9.1(0)8(4233642)(0)16(71127)(0)9.1(,0)1.0(,1428)(3225333647>⋅''<-=-=''<-=-='<>+-=f f x x x x x f x x x x x f f f x x x f故以1.9为起点⎪⎩⎪⎨⎧='-=+9.1)()(01x x f x f x x k k k k 如此一次一次的迭代,逼近x 的真实根。

当前后两个的差<=ε时,就认为求出了近似的根。

本程序用Newton 法求代数方程(最高次数不大于10)在(a,b )区间的根。

1.2 C语言程序原代码:#include<stdio.h>#include<math.h>main(){double x2,f,f1;double x1=1.9; //取初值为1.9do{x2=x1;f=pow(x2,7)-28*pow(x2,4)+14;f1=7*pow(x2,6)-4*28*pow(x2,3);x1=x2-f/f1;}while(fabs(x1-x2)>=0.00001||x1<0.1); //限制循环次数printf("计算结果:x=%f\n",x1);}1.3 运行结果:1.4 MATLAB上机程序function y=Newton(f,df,x0,eps,M)d=0;for k=1:Mif feval(df,x0)==0d=2;breakelsex1=x0-feval(f,x0)/feval(df,x0);ende=abs(x1-x0);x0=x1;if e<=eps&&abs(feval(f,x1))<=epsd=1;breakendendif d==1y=x1;elseif d==0y='迭代M次失败';elsey= '奇异'endfunction y=df(x)y=7*x^6-28*4*x^3;Endfunction y=f(x)y=x^7-28*x^4+14;End>> x0=1.9;>> eps=0.00001;>> M=100;>> x=Newton('f','df',x0,eps,M);>> vpa(x,7)1.5 问题讨论:1.使用此方法求方解,用误差来控制循环迭代次数,可以在误差允许的范围内得到比较理想的计算结果。

此程序的不足之处是,所要求解的方程必须满足上述定理的四个条件,但是第二和第四个条件在计算机上比较难以实现。

2.Newton迭代法是一个二阶收敛迭代式,他的几何意义Xi+1是Xi的切线与x轴的交点,故也称为切线法。

它是平方收敛的,但它是局部收敛的,即要求初始值与方程的根充分接近,所以在计算过程中需要先确定初始值。

3.本题在理论依据部分,讨论了区间(0.1,1.9)两端点是否能作为Newton迭代的初值,结果发现0.1不满足条件,而1.9满足,能作为初值。

另外,该程序简单,只有一个循环,且为顺序结构,故采用do-while循环。

当然也可以选择for 和while循环。

2.已知函数值如下表:试用三次样条插值求f(4.563)及f ’(4.563)的近似值。

2.1 理论依据332211111111111()()()()()()()6666j j j j j j j jj j j j j j j j x x x x h x x h x x S x M M y M y M h h h h ---------------=++-+-这里11j j j h x x --=- ,所以只要求出j M ,就能得出插值函数S (x )。

求j M 的方法为:00111122112122212N N N N M d M d M d μλμλμλ--⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦这里10000011111111116()6()(1,2,,1)61[()]1j j j j jj j j j N N N N N N j jj j j j j j j y y d y h hy y y y d j N h h h h d y y y h h h h h h h h μλμ+----------⎧'=-⎪⎪⎪--=-=-⎪+⎪⎨⎪'=--⎪⎪⎪==-=⎪++⎩最终归结为求解一个三对角阵的解。

用追赶法解三对角阵的方法如下:11112221222111111111n n n n n nnn n b c a b c l A LU l b c a l a b γβγββγβ-----⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥===⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦1,,,n L d LUx d L d Ux δδδδδδ⎡⎤=⎧⎢⎥===⎨⎢⎥=⎩⎢⎥⎣⎦即若记则由得 112111nn n d l l d δδ⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦ , 111111n n n n n x x βγδβγβδ--⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦综上可得求解方程Ax=d 的算法:1111111111111,,,,1,2,3,,1,,1,,2,1i i i i i i ii i i in i i i n i n i b d l b l c d l i n c xx x i n αβδββδδδδββ+++++++++⎧====-⎪⎪⎪=-=-⎨⎪-⎪===-⎪⎩2.2 C 语言程序代码:#include<stdio.h>#include<math.h>void main() {int i,j,m,n,k,p;double q10,p10,s4,g4,x0,x1,g0=1,g9=0.1;; double s[10][10];double a[10],b[10],c[10],d[10],e[10],x[10],h[9],u[9],r[9];double f[10]={0,0.69314718,1.0986123,1.3862944,1.6094378, 1.7917595,1.9459101,2.079445,2.1972246,2.3025851}; printf("请依次输入xi:\n"); for(i=0;i<=9;i++)scanf("%lf",&e[i]); //求h 矩阵 for(n=0;n<=8;n++) h[n]=e[n+1]-e[n];d[0]=6*((f[1]-f[0])/h[0]-g0)/h[0];d[9]=6*(g9-(f[9]-f[8])/h[8])/h[8];for(j=0;j<=7;j++)d[j+1]=6*((f[j+2]-f[j+1])/h[j+1]-(f[j+1]-f[j])/h[j])/(h[j]+h[j+1]);for(m=1;m<=8;m++)u[m]=h[m-1]/(h[m-1]+h[m]);for(k=1;k<=8;k++)r[k]=h[k]/(h[k-1]+h[k]);for(i=0;i<=9;i++) //求u矩阵for(p=0;p<=9;p++){s[i][p]=0;if(i==p)s[i][p]=2;}s[0][1]=1;s[9][8]=1;for(i=1;i<=8;i++){s[i][i-1]=u[i];s[i][i+1]=r[i];}printf("三对角矩阵为:\n");for(i=0;i<=9;i++)for(p=0;p<=9;p++) //求r矩阵{ printf("%5.2lf",s[i][p]);if(p==9){printf("\n");}}printf("根据追赶法解三对角矩阵得:\n");a[0]=s[0][0];b[0]=d[0];for(i=1;i<9;i++){c[i]=s[i][i-1]/a[i-1]; //求d矩阵a[i]=s[i][i]-s[i-1][i]*c[i];b[i]=d[i]-c[i]*b[i-1];if(i==8){p10=b[i];q10=a[i];}}x[9]=p10/q10;printf("M[10]=%lf\n",x[9]);for(i=9;i>=1;i--){x[i-1]=(b[i-1]-s[i-1][i]*x[i])/a[i-1];printf("M[%d]=%lf\n",i,x[i-1]);}printf("可得s(x)在区间[4,5]上的表达式;\n");printf("将x=4.563代入得:\n");x0=5-4.563;x1=4.563-4;s4=x[3]*pow(x0,3)/6+x[4]*pow(x1,3)/6+(f[3]-x[3]/6)*(5-4.563)+(f[4]-x[4]/6)*(4.563 -4);g4=-x[3]*pow(x0,2)/2+x[4]*pow(x1,2)/2-(f[3]-x[3]/6)+(f[4]-x[4]/6);printf("计算结果:f(4.563)的函数值是:%lf\nf(4.563)的导数值是:%lf\n",s4,g4);} 2.3 运行结果:2.4 问题讨论1. 三次样条插值效果比Lagrange插值好,没有Runge现象,光滑性较好。

相关文档
最新文档