计算方法实验报告
数值分析(计算方法)课程设计实验报告(附程序)

n=4 时,max[L(X)-h(X)]=0.4020;
n=8 时,max[L(X)-h(X)]=0.1708;
n=10 时,max[L(X)-h(X)]=0.1092。
图象分析: 从图象可以看出随着插值节点数的增加出现异常的摆动,中间能较好的接近 原函数,但两边却出现很大的误差。
(3).对定义在(-5,5)上的函数
程序代码 2:
x=[-1:0.2:1]; y=1./(1+25.*x.^2); x0=[-1:0.01:1]; y0=lagrange(x,y,x0); y1=1./(1+25.*x0.^2);
plot(x0,y0,'--r'); hold on; plot(x0,y1,'-b'); x2=abs(y0-y1); max(x2) ; 程序代码3: n=3; for i=1:n x(i)=cos(((2.*i-1).*pi)./(2.*(n+1))); y(i)=1./(1+25.*x(i).*x(i)); end x0=-1:0.01:1; y0=lagrange(x,y,x0); y1=1./(1+25.*x0.^2); plot(x0,y0,'--r') hold on plot(x0,y1,'-b')
以 x1,x2,„,xn+1 为插值节点构造上述各函数的 Lagrange 插值多项式, 比较其 结果。
设计过程: 已知函数 f(x)在 n+1 个点 x0,x1,…,xn 处的函数值为 y0,y1,…,yn 。 求一 n 次多 项式函数 Pn(x),使其满足: Pn(xi)=yi,i=0,1,…,n. 解决此问题的拉格朗日插值多项式公式如下
成本计算的实验报告

一、实验目的1. 理解成本计算的基本原理和方法。
2. 掌握成本计算在实际工作中的应用。
3. 提高对成本核算工作的认识和技能。
二、实验内容1. 确定成本计算对象。
2. 收集相关成本数据。
3. 分析成本构成。
4. 计算成本。
三、实验过程1. 实验准备(1)选择实验对象:本次实验以某企业某产品为对象,进行成本计算。
(2)收集成本数据:通过查阅企业相关资料,收集该产品在某个会计期间的成本数据,包括直接材料、直接人工、制造费用等。
2. 实验步骤(1)确定成本计算对象:以某企业某产品为对象,进行成本计算。
(2)收集相关成本数据:根据实验对象,收集直接材料、直接人工、制造费用等成本数据。
(3)分析成本构成:对收集到的成本数据进行分类,分析其构成。
(4)计算成本:①直接材料成本:根据实际领料数量和材料单价计算。
②直接人工成本:根据实际工时和工资标准计算。
③制造费用:根据实际生产工时和制造费用分配率计算。
④单位成本:将直接材料、直接人工、制造费用相加,得到单位成本。
⑤总成本:将单位成本乘以产品数量,得到总成本。
3. 实验结果(1)直接材料成本:50000元(2)直接人工成本:30000元(3)制造费用:20000元(4)单位成本:100000元/件(5)总成本:200000元四、实验分析1. 通过本次实验,掌握了成本计算的基本原理和方法,能够对企业的成本进行有效核算。
2. 在实验过程中,发现成本计算在实际工作中具有重要意义。
通过对成本的核算,企业可以了解产品的盈利能力,为决策提供依据。
3. 实验过程中,发现成本数据收集的准确性对成本计算结果具有重要影响。
因此,在实际工作中,应注重成本数据的准确性。
4. 成本计算方法的选择对结果也有一定影响。
在实际工作中,应根据企业特点和产品类型选择合适的成本计算方法。
五、实验总结1. 成本计算是企业管理的重要组成部分,对企业提高经济效益具有重要意义。
2. 掌握成本计算的基本原理和方法,有助于提高企业成本管理水平。
计算方法实验报告格式

计算方法实验报告格式小组名称:组长姓名(班号):小组成员姓名(班号):按贡献排序情况:指导教师评语:小组所得分数:一个完整的实验,应包括数据准备、理论基础、实验内容及方法,最终对实验结果进行分析,以达到对理论知识的感性认识,进一步加深对相关算法的理解,数值实验以实验报告形式完成,实验报告格式如下:一、实验名称实验者可根据报告形式需要适当写出.二、实验目的及要求首先要求做实验者明确,为什么要做某个实验,实验目的是什么,做完该实验应达到什么结果,在实验过程中的注意事项,实验方法对结果的影响也可以以实验目的的形式列出.三、算法描述(实验原理与基础理论)数值实验本身就是为了加深对基础理论及方法的理解而设置的,所以要求将实验涉及到的理论基础,算法原理详尽列出.四、实验内容实验内容主要包括实验的实施方案、步骤、实验数据准备、实验的算法以及可能用到的仪器设备.五、程序流程图画出程序实现过程的流程图,以便更好的对程序执行的过程有清楚的认识,在程序调试过程中更容易发现问题.六、实验结果实验结果应包括实验的原始数据、中间结果及实验的最终结果,复杂的结果可以用表格形式列出,较为简单的结果可以与实验结果分析合并出现.七、实验结果分析实验结果分析包括对对算法的理解与分析、改进与建议.数值实验报告范例为了更好地做好数值实验并写出规范的数值实验报告,下面给出一简单范例供读者参考.数值实验报告小组名称: 小组成员(班号): 按贡献排序情况: 指导教师评语: 小组所得分数:一、实验名称误差传播与算法稳定性.二、实验目的1.理解数值计算稳定性的概念. 2.了解数值计算方法的必要性. 3.体会数值计算的收敛性与收敛速度.三、实验内容计算dx x x I nn ⎰+=110,1,2,,10n = . 四、算法描述由 dx x x I nn ⎰+=110,知 dx x x I n n ⎰+=--101110,则ndx x dx x x x I I n n n n n 1101010101111==++=+⎰⎰---.得递推关系: (I )=n I 1101--n I n,10,,2,1 =n . (II ))1(1011n n I nI -=- ,1,,9,10 =n . 下面分别以(1)、(2)递推关系求解: 方案1 =n I 1101--n I n,10,,2,1 =n . 当0=n 时,=+=⎰dx x I 10101㏑=1011㏑1.1,递推公式为()10110,1,2,,10,ln 1.1.nn I I n n I -⎧=-=⎪⎨⎪=⎩(1) 方案2 )1(1011n n I nI -=-,1,,9,10 =n . 当10<<x 时, n n n x x x x 10110111≤+≤,则 dx x dx x x dx x nn n 1011011110101⎰⎰⎰≤+≤.即)1(101)1(111+≤≤+n I n n .取递推初值 )110(22021])110(101)110(111[2110+=+++≈I .递推公式为 11011(),10,9,,1,1021.220(101)n n I I n n I -⎧=-=⎪⎪⎨⎪=+⎪⎩(2) 取递推公式(1)中的初值095310.01.1ln 0≈=I ,得10110, 1,2,,10,0.095310.nn I I n n I -⎧=-=⎪⎨⎪≈⎩ 取递推公式(2)中的初值008678.010≈I ,得11011(),10,9,,1,100.008678.n n I I n n I -⎧=-=⎪⎨⎪≈⎩ 五、程序流程图由于实验方案明显、简单,实现步骤及流程图省略.六、实验结果计算结果如表1-2:表1-2 计算结果七、实验结果分析由递推公式(1)知当1.1ln 0=I 时,n I 应当为精确解,递推公式的每一步都没有误差的取舍,但计算结果033333.0~5=I >=016667.04~I ,6~I 出现负值.由此看出,当n 较大时,用递推公式(1)中的n I ~近似n I 是不正确的.主要原因是初值095310.0~0=I 不是精确值,设有误差)~(0I e ,由递推公式(1)知 )~(10)~(1--=n n I e I e 则有)~()10()~(100)~(10)~(021I e I e I e I e n n n n -=-=-=--误差)~(n I e 随n 的增大而迅速增加,增加到)~(0I e 的n )10(-倍.由此可见,递推公式计算的误差不仅取决于初值的误差,公式的精确性,还依赖于误差的传递即递推计算的稳定性.由递推公式(2)知 008678.010≈I ,n I 为估计值,并不精确,有12101)(10≤I e ,而由)(101)(**1n n I e I e -=- 得 )()101()(**0n n I e I e -= 误差)(*0I e 随递推公式逐步缩小.综上所述,在递推计算中,数值计算方法是非常重要的,误差估计、误差传播及递推计算的稳定性都会直接影响递推结果.。
计算方法实验报告

班级:地信11102班序号: 20姓名:任亮目录计算方法实验报告(一) (3)计算方法实验报告(二) (6)计算方法实验报告(三) (9)计算方法实验报告(四) (13)计算方法实验报告(五) (18)计算方法实验报告(六) (22)计算方法实验报告(七) (26)计算方法实验报告(八) (28)计算方法实验报告(一)一、实验题目:Gauss消去法解方程组二、实验学时: 2学时三、实验目的和要求1、掌握高斯消去法基础原理2、掌握高斯消去法法解方程组的步骤3、能用程序语言对Gauss消去法进行编程实现四、实验过程代码及结果1、实验算法及其代码模块设计(1)、建立工程,建立Gauss.h头文件,在头文件中建类,如下:class CGauss{public:CGauss();virtual ~CGauss();public:float **a; //二元数组float *x;int n;public:void OutPutX();void OutputA();void Init();void Input();void CalcuA();void CalcuX();void Calcu();};(2)、建立Gauss.cpp文件,在其中对个函数模块进行设计2-1:构造函数和析构函数设计CGauss::CGauss()//构造函数{a=NULL;x=NULL;cout<<"CGauss类的建立"<<endl;}CGauss::~CGauss()//析构函数{cout<<"CGauss类撤销"<<endl;if(a){for(int i=1;i<=n;i++)delete a[i];delete []a;}delete []x;}2-2:函数变量初始化模块void CGauss::Init()//变量的初始化{cout<<"请输入方程组的阶数n=";cin>>n;a=new float*[n+1];//二元数组初始化,表示行数for(int i=1;i<=n;i++){a[i]=new float[n+2];//表示列数}x=new float[n+1];}2-3:数据输入及输出验证函数模块void CGauss::Input()//数据的输入{cout<<"--------------start A--------------"<<endl;cout<<"A="<<endl;for(int i=1;i<=n;i++)//i表示行,j表示列{for(int j=1;j<=n+1;j++){cin>>a[i][j];}}cout<<"--------------- end --------------"<<endl;}void CGauss::OutputA()//对输入的输出验证{cout<<"-----------输出A的验证-----------"<<endl;for(int i=1;i<=n;i++){for(int j=1;j<=n+1;j++){cout<<a[i][j]<<" ";}cout<<endl;}cout<<"---------------END--------------"<<endl;}2-4:消元算法设计及实现void CGauss::CalcuA()//消元函数for(int k=1 ;k<n;k++){for(int i=k+1;i<=n;i++){double lik=a[i][k]/a[k][k];for(int j=k;j<=n+1;j++){a[i][j]-=lik*a[k][j];}a[i][k]=0; //显示消元的效果}}}2-5:回代计算算法设计及函数实现void CGauss::CalcuX()//回带函数{for(int i=n;i>=1;i--){double s=0;for(int j=i+1;j<=n;j++){s+=a[i][j]*x[j];}x[i]=(a[i][n+1]-s)/a[i][i];}}2-6:结果输出函数模块void CGauss::OutPutX()//结果输出函数{cout<<"----------------X---------------"<<endl;for(int i=1 ;i<=n;i++){cout<<"x["<<i<<"]="<<x[i]<<endl;}}(3)、“GAUSS消元法”主函数设计int main(int argc, char* argv[]){CGauss obj;obj.Init();obj.Input();obj.OutputA();obj.CalcuA();obj.OutputA();obj.CalcuX();obj.OutPutX();//obj.Calcu();return 0;2、实验运行结果计算方法实验报告(二)一、实验题目:Gauss列主元消去法解方程组二、实验学时: 2学时三、实验目的和要求1、掌握高斯列主元消去法基础原理(1)、主元素的选取(2)、代码对主元素的寻找及交换2、掌握高斯列主元消去法解方程组的步骤3、能用程序语言对Gauss列主元消去法进行编程实现四、实验过程代码及结果1、实验算法及其代码模块设计(1)、新建头文件CGuassCol.h,在实验一的基础上建立类CGauss的派生类CGuassCol公有继承类CGauss,如下:#include "Gauss.h"//包含类CGauss的头文件class CGaussCol:public CGauss{public:CGaussCol();//构造函数virtual ~CGaussCol();//析构函数public:void CalcuA();//列主元的消元函数int FindMaxIk(int k);//寻找列主元函数void Exchange(int k,int ik);//交换函数void Calcu();};(2)、建立CGaussCol.cpp文件,在其中对个函数模块进行设计2-1:头文件的声明#include "stdafx.h"#include "CGuassCol.h"#include "math.h"#include "iostream.h"2-2:派生类CGaussCol的构造函数和析构函数CGaussCol::CGaussCol()//CGaussCol类构造函数{cout<<"CGaussCol类被建立"<<endl;}CGaussCol::~CGaussCol()//CGaussCol类析构函数{cout<<"~CGaussCol类被撤销"<<endl;}2-3:高斯列主元消元函数设计及代码实现void CGaussCol::CalcuA()//{for(int k=1 ;k<n;k++){int ik=this->FindMaxIk(k);if(ik!=k)this->Exchange(k,ik);for(int i=k+1;i<=n;i++){float lik=a[i][k]/a[k][k];for(int j=k;j<=n+1;j++){a[i][j]-=lik*a[k][j];}}}}2-4:列主元寻找的代码实现int CGaussCol::FindMaxIk(int k)//寻找列主元{float max=fabs(a[k][k]);int ik=k;for(int i=k+1;i<=n;i++){if(max<fabs(a[i][k])){ik=i;max=fabs(a[i][k]);}}return ik;}2-5:主元交换的函数模块代码实现void CGaussCol::Exchange(int k,int ik)//做交换{for(int j=k;j<=n+1;j++){float t=a[k][j];a[k][j]=a[ik][j];a[ik][j]=t;}}(3)、建立主函数main.cpp文件,设计“Gauss列主元消去法”主函数模块3-1:所包含头文件声明#include "stdafx.h"#include "Gauss.h"#include "CGuassCol.h"3-2:主函数设计int main(int argc, char* argv[]){CGaussCol obj;obj.Init();//调用类Gauss的成员函数obj.Input();//调用类Gauss的成员函数obj.OutputA();//调用类Gauss的成员函数obj.CalcuA();obj.OutputA();obj.CalcuX();obj.OutPutX();return 0;}2、实验结果计算方法实验报告(三)一、实验题目:Gauss完全主元消去法解方程组二、实验学时: 2学时三、实验目的和要求1、掌握高斯完全主元消去法基础原理;2、掌握高斯完全主元消去法法解方程组的步骤;3、能用程序语言对Gauss完全主元消去法进行编程(C++)实现。
东南大学计算方法实验报告

计算方法与实习实验报告学院:电气工程学院指导老师:***班级:160093******学号:********实习题一实验1 拉格朗日插值法一、方法原理n次拉格朗日插值多项式为:L n(x)=y0l0(x)+y1l1(x)+y2l2(x)+…+y n l n(x)n=1时,称为线性插值,L1(x)=y0(x-x1)/(x0-x1)+ y1(x-x0)/(x1-x0)=y0+(y1-x0)(x-x0)/(x1-x0)n=2时,称为二次插值或抛物线插值,精度相对高些L2(x)=y0(x-x1)(x-x2)/(x0-x1)/(x0-x2)+y1(x-x0)(x-x2)/(x1-x0)/(x1-x2)+y2(x-x0)(x-x1)/(x2-x0)/(x2-x1)二、主要思路使用线性方程组求系数构造插值公式相对复杂,可改用构造方法来插值。
对节点x i(i=0,1,…,n)中任一点x k(0<=k<=n)作一n 次多项式l k(x k),使它在该点上取值为1,而在其余点x i(i=0,1,…,k-1,k+1,…,n)上为0,则插值多项式为L n(x)=y0l0(x)+y1l1(x)+y2l2(x)+…+y n l n(x) 上式表明:n 个点x i(i=0,1,…,k-1,k+1,…,n)都是l k(x)的零点。
可求得l k三.计算方法及过程:1.输入节点的个数n2.输入各个节点的横纵坐标3.输入插值点4.调用函数,返回z函数语句与形参说明程序源代码如下:#include<iostream>#include<math.h>using namespace std;#define N 100double fun(double *x,double *y, int n,double p);void main(){int i,n;cout<<"输入节点的个数n:";cin>>n;double x[N], y[N],p;cout<<"please input xiangliang x= "<<endl;for(i=0;i<n;i++)cin>>x[i];cout<<"please input xiangliang y= "<<endl;for(i=0;i<n;i++)cin>>y[i];cout<<"please input LagelangrichazhiJieDian p= "<<endl;cin>>p;cout<<"The Answer= "<<fun(x,y,n,p)<<endl;system("pause") ;}double fun(double x[],double y[], int n,double p){double z=0,s=1.0;int k=0,i=0;double L[N];while(k<n){ if(k==0){ for(i=1;i<n;i++)s=s*(p-x[i])/(x[0]-x[i]);L[0]=s*y[0];k=k+1;}else{s=1.0;for(i=0;i<=k-1;i++)s=s*((p-x[i])/(x[k]-x[i]));for(i=k+1;i<n;i++) s=s*((p-x[i])/(x[k]-x[i]));L[k]=s*y[k];k++;}}for(i=0;i<n;i++)z=z+L[i];return z;}五.实验分析n=2时,为一次插值,即线性插值n=3时,为二次插值,即抛物线插值n=1,此时只有一个节点,插值点的值就是该节点的函数值n<1时,结果都是返回0的;这里做了n=0和n=-7两种情况3<n<100时,也都有相应的答案常用的是线性插值和抛物线插值,显然,抛物线精度相对高些n次插值多项式Ln(x)通常是次数为n的多项式,特殊情况可能次数小于n.例如:通过三点的二次插值多项式L2(x),如果三点共线,则y=L2(x)就是一条直线,而不是抛物线,这时L2(x)是一次式。
计算方法与计算 实验一误差分析

% 输出的量--每次迭代次数k和迭代值xk,
%
--每次迭代的绝对误差juecha和相对误差xiangcha,
误差分析
误差问题是数值分析的基础,又是数值分析中一个困难的课题。在实际计算 中,如果选用了不同的算法,由于舍入误差的影响,将会得到截然不同的结果。 因此,选取算法时注重分析舍入误差的影响,在实际计算中是十分重要的。同时, 由于在数值求解过程中用有限的过程代替无限的过程会产生截断误差,因此算法 的好坏会影响到数值结果的精度。 一、实验目的
因为运行后输出结果为: y 1.370 762 168 154 49, yˆ =1.370 744 664 189
38, R 1.750 396 510 491 47e-005, WU= 1.782 679 830 970 664e-005 104 . 所
以, yˆ 的绝对误差为 10 4 ,故 y
③ 运行后输出计算结果列入表 1–1 和表 1-2 中。
④ 将算法 2 的 MATLAB 调用函数程序的函数分别用 y1=15-2*x^2 和
y1=x-(2*x^2+x-15)/(4*x+1)代替,得到算法 1 和算法 3 的调用函数程序,将其保
存,运行后将三种算法的前 8 个迭代值 x1, x2 ,, x8 列在一起(见表 1-1),进行
的精确解 x* 2.5 比较,观察误差的传播.
算法 1 将已知方程化为同解方程 x 15 2x2 .取初值 x0 2 ,按迭代公式
xk1 15 2xk2
数值计算方法I实验报告

实验报告实验课程名称数值计算方法I开课实验室数学实验室学院理学院年级2012 专业班信息与计算科学2班学生姓名学号开课时间2012 至2013 学年第 2 学期实验一 误差分析试验1.1(病态问题)问题提出:考虑一个高次的代数多项式)1.1()()20()2)(1()(201∏=-=---=k k x x x x x p显然该多项式的全部根为1,2,…,20共计20个,且每个根都是单重的。
现考虑该多项式的一个扰动)2.1(0)(19=+x x p ε其中ε是一个非常小的数。
这相当于是对(1.1)中19x 的系数作一个小的扰动。
我们希望比较(1.1)和(1.2)根的差别,从而分析方程(1.1)的解对扰动的敏感性。
实验内容:为了实现方便,我们先介绍两个MA TLAB 函数:“roots ”和“poly ”。
roots(a)u =其中若变量a 存储n+1维的向量,则该函数的输出u 为一个n 维的向量。
设a 的元素依次为121,,,+n a a a ,则输出u 的各分量是多项式方程01121=+++++-n n n n a x a x a x a的全部根;而函数 poly(v)b =的输出b 是一个n+1维向量,它是以n 维向量v 的各分量为根的多项式的系数。
可见“roots ”和“poly ”是两个互逆的运算函数。
))20:1((;)2();21,1(;000000001.0ve poly roots ess ve zeros ve ess +===上述简单的MA TLAB 程序便得到(1.2)的全部根,程序中的“ess ”即是(1.2)中的ε。
实验要求:(1)选择充分小的ess ,反复进行上述实验,记录结果的变化并分析它们。
如果扰动项的系数ε很小,我们自然感觉(1.1)和(1.2)的解应当相差很小。
计算中你有什么出乎意料的发现?表明有些解关于如此的扰动敏感性如何?(2)将方程(1.2)中的扰动项改成18x ε或其它形式,实验中又有怎样的现象? (3)(选作部分)请从理论上分析产生这一问题的根源。
「实验报告计算方法」

「实验报告计算方法」实验报告的计算方法包括统计数据的处理、数据分析与图表的绘制等内容。
下面将以实验报告中常见的计算方法为例进行详细介绍。
首先,实验报告中常见的计算方法之一是平均值的计算。
在实验中,往往需要多次重复测量同一个实验现象或现象相关的参数,然后将测得的数据求平均值。
计算平均值的步骤如下:1.将测得的数据依次排列;2.求出所有数据的总和;3.将总和除以数据的个数,得到平均值。
例如,实验中测得物体从起点到终点的位移分别为32 cm、35 cm和38 cm,那么求位移的平均值时,先将这3个数相加得到:32 + 35 + 38 = 105 cm,然后将总和105除以3(数据的个数),得到位移的平均值为35 cm。
第二,实验报告中还常常需要计算数据组的标准差。
标准差是用来描述一组数据的离散程度的指标,用来衡量数据的分散程度。
计算标准差的步骤如下:1.求出数据的平均值;2.将每组数据减去平均值后的差值平方;3.将所有平方差值相加;4.将总和除以数据的个数;5.将上一步骤的结果开平方,得到标准差。
例如,实验中测得物体从起点到终点的位移分别为32 cm、35 cm和38 cm,先求位移的平均值得到35 cm,然后将每组数据减去平均值后的差值平方,得到:(32-35)^2 + (35-35)^2 + (38-35)^2 = 9 + 0 + 9 = 18,然后将平方差值相加得到18,再将18除以3(数据的个数),得到6,最后将6开平方,得到标准差为2.45 cm。
第三,实验报告中还涉及数据的比较与分析。
通过比较不同样本或者不同实验条件下的数据来推导结论。
常用的比较与分析方法有:T检验、方差分析、线性回归等。
T检验用于比较两组数据的均值是否存在显著差异。
根据两组数据的均值、标准差和数据个数,通过T检验的统计分析可以给出是否存在显著差异的结论。
方差分析用于比较多组数据的均值是否存在显著差异。
根据多组数据的均值、标准差和数据个数,通过方差分析的统计分析可以给出是否存在显著差异的结论。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算方法实验报告姓名:耿乐学号:913000710013指导老师:李建良实验日期:2014.11实验一 数值积分的数值实验一、摘要: 本文对函数2)5(11)(x x f +=,x ∈[-1,1],取n+1个基点, ,1ih x i +-= i =0,1,2,…,n, 步长nh 2=,求n 次插值多项式)(x P n ,计算最大相对误差,并将)(x f 和)(x P n 画在坐标系中。
二、算法:根据节点的特征,本文采用了Newton 插值法来生成插值函数。
程序算法如下:求出插值函数)(x P n 各次项的系数,生成)(x P n ,并求最大相对误差。
将第i+1阶差商对应的多项式 )())((10i x x x x x x -⋅⋅⋅--展开 定义函数)(x f ,取各节点i x ,并求出各节点的函数值)(i x f 生成相应的差商表最后,将原函数和插值多项式图像画在同一坐标系中进行比较,并计算相应n值时的最大相对误差。
三、源程序#include<stdio.h>#include<math.h>#define n 4int main(){int i,j,t,k;double co[n+1]={0},x[n+1],f[n+1],c[n+1][n+1]={0};double table[n+1][n+1]={0},temp[n+1]={0};double h=2.0/n,max,a,te;double fun(double x);double cha(double *co,double x);for(i=0;i<=n;i++){x[i]=-1.0+i*h;table[i][0]=fun(x[i]);}for(j=1;j<=n;j++){for(i=0;i<=n-j;i++){table[i][j]=(table[i+1][j-1]-table[i][j-1])/(x[i+j]-x[i]);}f[j]=table[0][j];} //生成差商表printf("差商表为:\n");for(i=0;i<=n;i++){printf("%8.4f\t",x[i]);for(j=0;j<=n;j++)printf("%8.4f",table[i][j]);printf("\n");}printf("\n");c[0][0]=1.0;for(k=1;k<=n;k++){c[k][0]=0;for(i=0;i<=k;i++){c[k][i+1]=c[k-1][i];}for(j=0;j<k;j++){c[k][j]=c[k][j]-c[k-1][j]*x[k-1];}} //求(x-x0)(x-x1)···(x-xi)展开系数/*for(i=0;i<=n;i++){for(j=0;j<=n;j++){printf("%8.4f",c[i][j]);}printf("\n");}*/for(i=0;i<=n;i++){f[i]=table[0][i];} //取出差商表第一行printf("\n");for(i=0;i<=n;i++){for(j=0;j<=n;j++){co[i]+=f[j]*c[j][i];}} //求各次项系数printf("插值函数为:\nPn(x)=");for(i=n;i>=0;i--){if(co[i]>=-0.00000001&&co[i]<=0.00000001) continue;printf("+(%8.5fx^%d)",co[i],i);}printf("\n");printf("最大相对误差为:\n");max=0;for(a=-1.0;a<=1.0;a+=0.01){te=1.0-cha(co,a)/fun(a);If(te<0)te=-te;if(te>max)max=te;} //求最大相对误差printf("%f\n",max);return 0;}double fun(double x) //原函数{return (1.0/(1.0+25.0*x*x));}double cha(double *co,double x) //插值函数{double t=0;int i;for(i=n;i>=0;i--){t+=co[i]*pow(x,i);}return t;}四、实验结果及分析1、n=2196154.0)(22+-=x x P最大相对误差为6.00722、n=41277.4316.3)(244+-=x x x P最大相对误差为7.44833、n=61784.8957.20134.13)(2466+-+-=x x x x P最大相对误差为12.91124、n=81203.1336721.61815.102689.53)(24688+-+-=x x x x x P 最大相对误差为21.40135、n=101855.16360.123434.381910.494942.220)(24681010+-+-+-=x x x x x x P 最大相对误差为32.5478五、实验结论可以看出,插值次数较低时,插值函数与原函数差异明显,相对误差较大;而插值次数增大时,仅在零点附近较小的区域,插值函数与原函数较为接近,而其他部分,尤其是靠近区域两侧边缘的区间上,误差极大。
这一现象称为龙格现象。
因此,可采用分段Hermite 插值法进行改进。
实验二 线性方程组求解的数值实验一、摘要本文对从2到9的每一个n 值,解n 阶方程组b Ax =,在这里A 和b 如下定义:121(),(,,......,),(1),,1,2,...,,(1)(1),1,2,...,,T i j n n n ij i A a b b b b a i j i j n b p n i p i i n ⨯-===+-==+---= 其中)]})312(14[7{2(24)(222n n n x x x p +++-+=,最后解释其中现象。
二、算法由于本案例的特殊性——系数矩阵为对称矩阵,可以采用平方根法来求解。
同时由于系数矩阵中元素的特殊分布,在采用高斯消去法时即是在采用列主元消去法。
两种算法如下:1)高斯消去法输入生成增广矩阵对系数矩阵采用高斯消去法生成上三角矩阵(为方便后面运算,可在转化是把主对角元素都化为1) 按从下往上的顺序求解2)平方根法输入生成增广矩阵求出下三角矩阵L,对角矩阵D按从上往下的顺序求出列阵y按从下往上的顺序求出列阵x三、源程序1)高斯消去法#include<stdio.h>#define N 9int main(){double a[N+1][N+1],b[N+1],t,x[N+1];int i,j,k;double p(int x);for(i=1;i<=N;i++){for(j=1;j<=N;j++){a[i][j]=1.0/(i+j-1);}b[i]=p(N+i-1)-p(i-1);} //生成增广矩阵printf("增广矩阵\n");for(i=1;i<=N;i++){for(j=1;j<=N;j++){printf("%-7.4f",a[i][j]);}printf("\t%-7.4f\n",b[i]); }printf("\n");for(k=1;k<=N;k++){t=a[k][k];for(j=k;j<=N;j++){a[k][j]=a[k][j]/t;}b[k]=b[k]/t; //每次化三角前把首个元素化为1 for(i=k+1;i<=N;i++){t=a[i][k]/a[k][k];for(j=k;j<=N;j++){a[i][j]=a[i][j]-t*a[k][j];}b[i]=b[i]-t*b[k];} //化下三角}printf("化简后的增广矩阵\n");for(i=1;i<=N;i++){for(j=1;j<=N;j++){printf("%-6.2f",a[i][j]);}printf("\t%-8.4f\n",b[i]);}printf("\n");for(i=N;i>=1;i--){t=0;for(j=i+1;j<=N;j++){t+=a[i][j]*x[j];}x[i]=(b[i]-t)/a[i][i];} //倒序求解printf("方程组解\n");for(i=1;i<=N;i++){printf("x%d=%25f\n",i,x[i]);}return 0;}double p(int x){double t;t=14.0+N*(12+3*N);t=-7+N*N*t;t=x*x*t+2.0;t=(x*x*t)/24.0;return t;}2)平方根法#include<stdio.h>#define N 9int main(){int i,j,s;double temp;double p(int x);double a[N+1][N+1],b[N+1],x[N+1],y[N+1];double low[N+1][N+1]={0},d[N+1];printf("增广矩阵\n");for(i=1;i<=N;i++){for(j=1;j<=N;j++){a[i][j]=1.0/(i+j-1);}b[i]=p(N+i-1)-p(i-1);} //生成增广矩阵for(i=1;i<=N;i++){for(j=1;j<=N;j++){printf("%-6.3f",a[i][j]);}printf("\t");printf("%-6.3f\n",b[i]);}for(j=1;j<=N;j++){low[j][j]=1;temp=0;for(s=1;s<j;s++){temp+=low[j][s]*low[j][s]*d[s];}d[j]=a[j][j]-temp;for(i=j+1;i<=N;i++){temp=0;for(s=1;s<j;s++){temp+=low[i][s]*low[j][s]*d[s];}low[i][j]=(a[i][j]-temp)/d[j];}}y[1]=b[1];for(i=2;i<=N;i++){temp=0;for(s=0;s<i;s++){temp+=low[i][s]*y[s];}y[i]=b[i]-temp;}x[N]=y[N]/d[N];for(i=N-1;i>=1;i--){temp=0;for(s=i+1;s<=N;s++){temp+=low[s][i]*x[s];}x[i]=y[i]/d[i]-temp;}printf("\n方程组解为\n");for(i=1;i<=N;i++){printf("x%d=%25f\n",i,x[i]);}return 0;}double p(int x){double t;t=14.0+N*(12+3*N);t=-7+N*N*t;t=x*x*t+2.0;t=(x*x*t)/24.0;return t;}四、计算结果以下给出两种方法下n为2,5,9的计算结果:1)n=22)n=53)n=9六、实验结论由计算可以看出,随着n的增大,两种计算结果差别变得非常大,用其他软件计算解时会发现以上解的误差会比较大,这是因为随着n 增大,系数矩阵的条件数变大,微小的扰动就容易造成很大的误差,可以认为该方程组是病态的最后得不到精确解。