计算方法实验报告
数值分析(计算方法)课程设计实验报告(附程序)
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.体会数值计算的收敛性与收敛速度.三、实验内容计算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++)实现。
计算方法与计算 实验一误差分析
% 输出的量--每次迭代次数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
1341901124-武易-计算方法
计算方法实验报告1341901124 武易计算机科学与技术实验一——插值方法一实验目的通过本次上机实习,能够进一步加深对各种插值算法的理解;学会使用用三种类型的插值函数的数学模型、基本算法,结合相应软件(如VC/VB/Delphi/Matlab/JAVA/Turbo C)编程实现数值方法的求解。
并用该软件的绘图功能来显示插值函数,使其计算结果更加直观和形象化。
二实验内容通过程序求出插值函数的表达式是比较麻烦的,常用的方法是描出插值曲线上尽量密集的有限个采样点,并用这有限个采样点的连线,即折线,近似插值曲线。
取点越密集,所得折线就越逼近理论上的插值X n中,通过插值方法计算得到的对应纵坐标存放曲线。
本实验中将所取的点的横坐标存放于动态数组[]Y n中。
于动态数组[]三源程序清单Cahzhi.cpp// cahzhi.cpp : 定义应用程序的入口点。
//#include"stdafx.h"#include"cahzhi.h"#include"resource.h"#include"defSelf.h"#include<iostream>#include<vector>usingnamespace std;#define MAX_LOADSTRING 100// 全局变量:HINSTANCE hInst; // 当前实例WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名WCHAR errorMsg[MAX_LOADSTRING];vector<POINT> vp; //取点vector<POINT> wvp; //相应窗体点POINT oriWin; //原点// 此代码模块中包含的函数的前向声明:ATOM MyRegisterClass(HINSTANCE hInstance);BOOL InitInstance(HINSTANCE, int);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);int APIENTRY wWinMain(_In_HINSTANCE hInstance,_In_opt_HINSTANCE hPrevInstance,_In_LPWSTR lpCmdLine,_In_int nCmdShow){UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);// TODO: 在此放置代码。
数值计算方法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检验的统计分析可以给出是否存在显著差异的结论。
方差分析用于比较多组数据的均值是否存在显著差异。
根据多组数据的均值、标准差和数据个数,通过方差分析的统计分析可以给出是否存在显著差异的结论。
计算方法实验报告习题2(浙大版)
计算方法实验报告实验名称: 实验2 列主元素消去法解方程组 1 引言工程实际问题中,线型方程的系数矩阵一般为低阶稠密矩阵和大型稀疏矩阵。
用高斯消去法解Ax =b 时,可能出现)(k kk a 很小,用作除数会导致中间结果矩阵元素数量级严重增长和舍入误差的扩散,使结果不可靠;采用选主元素的三角分解法可以避免此类问题。
高斯消去法的消去过程,实质上是将A 分解为两个三角矩阵的乘积A =LU ,并求解Ly =b 的过程。
回带过程就是求解上三角方程组Ux =y 。
所以在实际的运算中,矩阵L 和U 可以直接计算出,而不需要任何中间步骤,从而在计算过程中将高斯消去法的步骤进行了进一步的简略,大大提高了运算速度,这就是三角分解法。
采用选主元的方式与列主元高斯消去法一样,也是为了避免除数过小,从而保证了计算的精确度。
2 实验目的和要求通过列主元素消去法求解线性方程组,实现P A =LU 。
要求计算解x ,L ,U ,整形数组IP (i ),(i =1,2,…,)(记录主行信息)。
3 算法原理与流程图(1)原理将A 分解为两个三角矩阵的乘积A =LU 。
对方程组的增广矩阵[]b A A ,=经过k-1步分解后,可变成如下形式:⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡→-------------n nnnjnkk n n n i in ij ik k i i i k kn kj kk k k k k k n k j k k k k k k k n j k k n j k k b a a a l l l b a a a l l l b a a a l l l y u u u u l l y u u u u u l y u u u u u u A1,211,211,211,1,1,11,12,11,122221,2222111,1,11,11211第k 步分解,为了避免用绝对值很小的数kku 作除数,引进量1111 (,1,,;1,2,,) ()/ (1,2,,;1,2,,)k kj kj km mj m k ik ik im mk kk m u a l u j k k n k n l a l u u i k k n k n -=-=⎧=-=+=⎪⎪⎨⎪=-=++=⎪⎩∑∑11(,1,,)k i ik im mkm s a l u i k k n -==-=+∑,于是有kk u =ks 。
实验报告产量怎么算
实验报告产量怎么算实验报告产量的计算方法取决于实验的具体内容和目的。
一般来说,产量是实验中所得的产品数量或者产物的质量。
以下是几种常见实验的产量计算方法:1. 化学反应实验的产量计算:化学反应的产物通常可以通过化学方程式确定,根据反应物的量或质量来计算产物的量或质量。
产量计算的基本公式为:产量= 反应物限定用量×产物理论摩尔比×产物相对分子质量或相对原子质量。
例如,对于2H₂+ O₂→2H₂O反应,若限定用量为2mol的H₂,且理论反应比为2:1,产物为水(H₂O) 的相对分子质量为18g/mol,则产量为2mol ×1 ×18g/mol = 36g。
2. 物理实验的产量计算:例如,对于一个制备某种溶液的实验,产量可以根据所使用的溶质质量、摩尔质量以及溶液的摩尔浓度来计算。
产量计算的基本公式为:产量= 溶质的质量(或摩尔数)/ 溶液的摩尔浓度。
例如,若所制备溶液的溶质质量为4g,溶质的摩尔质量为36g/mol,溶液的摩尔浓度为0.2mol/L,则产量为4g / (0.2mol/L) = 20L。
3. 生物实验的产量计算:生物实验中的产量通常是指某种微生物、细胞或者酶反应所产生的某种产物的数量或质量。
产量的计算方法根据实验种类的不同而不同。
例如,在细菌培养实验中,可以通过对培养基中细菌的计数来计算产量;在酶催化实验中,可以通过反应产物的检测与定量来确定产量。
总而言之,实验报告产量的计算方法需要结合具体的实验内容和目的来确定。
无论是化学反应、物理实验还是生物实验,都需要根据实验条件和所得结果确定合适的产量计算方法,并保证计算的准确和可靠性。
计算方法实验报告(附代码)
实验一 牛顿下山法实验说明:求非线性方程组的解是科学计算常遇到的问题,有很多实际背景.各种算法层出不穷,其中迭代是主流算法。
只有建立有效的迭代格式,迭代数列才可以收敛于所求的根。
因此设计算法之前,对于一般迭代进行收敛性的判断是至关重要的。
牛顿法也叫切线法,是迭代算法中典型方法,只要初值选取适当,在单根附近,牛顿法收敛速度很快,初值对于牛顿迭代 至关重要。
当初值选取不当可以采用牛顿下山算法进行纠正。
牛顿下山公式:)()(1k k k k x f x f x x '-=+λ下山因子 ,,,,322121211=λ下山条件|)(||)(|1k k x f x f <+实验代码:#include<iostream> #include<iomanip> #include<cmath>using namespace std;double newton_downhill(double x0,double x1); //牛顿下山法函数,返回下山成功后的修正初值double Y; //定义下山因子Y double k; //k为下山因子Y允许的最小值double dfun(double x){return 3*x*x-1;} //dfun()计算f(x)的导数值double fun1(double x){return x*x*x-x-1;} //fun1()计算f(x)的函数值double fun2(double x) {return x-fun1(x)/dfun(x);} //fun2()计算迭代值int N; //N记录迭代次数double e; //e表示要求的精度int main(){double x0,x1;cout<<"请输入初值x0:";cin>>x0;cout<<"请输入要求的精度:";cin>>e;N=1;if(dfun(x0)==0){cout<<"f'(x0)=0,无法进行牛顿迭代!"<<endl;}x1=fun2(x0);cout<<"x0"<<setw(18)<<"x1"<<setw(18)<<"e"<<setw(25)<<"f(x1)-f(x0)"<<endl;cout<<setiosflags(ios::fixed)<<setprecision(6)<<x0<<" "<<x1<<" "<<fabs(x1-x0)<<" "<<fabs(fun1(x1))-fabs(fun1(x0))<<endl;if(fabs(fun1(x1))>=fabs(fun1(x0))){ //初值不满足要求时,转入牛顿下山法x1=newton_downhill(x0,x1);} //牛顿下山法结束后,转入牛顿迭代法进行计算while(fabs(x1-x0)>=e){ //当精度不满足要求时N=N+1;x0=x1;if(dfun(x0)==0){cout<<"迭代途中f'(x0)=0,无法进行牛顿迭代!"<<endl;} x1=fun2(x0);cout<<setiosflags(ios::fixed)<<setprecision(6)<<x0<<" "<<x1<<" "<<fabs(x1-x0)<<endl;}cout<<"迭代值为:"<<setiosflags(ios::fixed)<<setprecision(6)<<x1<<'\n';cout<<"迭代次数为:"<<N<<endl;return 0;}double newton_downhill(double x0,double x1){Y=1;cout<<"转入牛顿下山法,请输入下山因子允许的最小值:";cin>>k;while(fabs(fun1(x1))>=fabs(fun1(x0))){if(Y>k){Y=Y/2;}else {cout<<"下山失败!";exit(0);}x1=x0-Y*fun1(x0)/dfun(x0);}//下山成功则cout<<"下山成功!Y="<<Y<<",转入牛顿迭代法计算!"<<endl;return x1;}实验结果:图4.1G-S 迭代算法流程图实验二 高斯-塞德尔迭代法实验说明:线性方程组大致分迭代法和直接法。
计算方法实验报告
实验一:误差传播与算法稳定性实验目的:体会稳定性在选择算法中的地位。
实验内容:考虑一个简单的由积分定义的序列10I ,0,1,10nn x dx n a x==+⎰其中a 为参数,分别对0.05a =及15a =按下列两种方法计算。
方案1:用递推公式11,1,2,,10n n I aI n n-=-+= 递推初值可由积分直接得01lna I a+= 方案2:用递推公式111(),,1,,1n n I I n N N a n-=-+=-根据估计式当1n a n ≥+时,11(1)(1)(1)n I a n a n <<+++或当01n a n ≤<+时,11(1)(1)n I a n n<≤++ 取递推初值 当1n a n ≥+时, 11121()2(1)(1)(1)2(1)(1)N N a I I a N a N a a N +≈+=+++++ 当01n a n ≤<+时,111()2(1)(1)N N I I a N N≈+++ 实验要求:列出结果,并对其稳定性进行分析比较,说明原因。
实验二:非线性方程数值解法实验目的:探讨不同方法的计算效果和各自特点 实验内容:应用算法(1)牛顿法;(2)割线法 实验要求:(1)用上述各种方法,分别计算下面的两个例子。
在达到精度相同的前提下,比较其迭代次数。
(I )31080x x +-=,取00x =;(II) 2281(0.1)sin 1.060x x x -+++=,取00x =;(2) 取其它的初值0x ,结果如何?反复选取不同的初值,比较其结果; (3) 总结归纳你的实验结果,试说明各种方法的特点。
实验三:选主元高斯消去法----主元的选取与算法的稳定性问题提出:Gauss 消去法是我们在线性代数中已经熟悉的。
但由于计算机的数值运算是在一个有限的浮点数集合上进行的,如何才能确保Gauss 消去法作为数值算法的稳定性呢?Gauss 消去法从理论算法到数值算法,其关键是主元的选择。
数值计算方法实验报告(例)
实验报告一、实验目的二、实验内容三、实验环境四.实验方法五、实验过程1实验步骤2 关键代码及其解释3 调试过程六、实验总结1.遇到的问题及解决过程2.产生的错误及原因分析3.体会和收获。
七、程序源代码:八、教师评语实验报告一.试验目的:练习用数值方法求解给定的非线性方程。
二.实验内容:求解人口方程: )1(5.43e 1004.156-+=λλλe要求误差小于410-。
三.实验环境:PC 计算机,FORTRAN 、C 、C ++、VB 任选一种。
四.实验方法:牛顿法牛顿法简述:牛顿法是一种特殊的迭代法,其迭代公式为:,2,1,0,)()(1='-=+k x f x f x x k k k k ,当数列{}k x 收敛时,其极限值x 即为方程的解。
定理:给定方程],[,0)(b a x x f ∈=1)设0)()(<b f a f ;2))(x f ''在],[b a 上不变号,且],[,0)(b a x x f ∈≠'; 3)选取],[0b a x ∈,满足0)()(00>''x f x f ;则牛顿法产生的序列{}k x 收敛于0)(=x f 在],[b a 内的唯一解x 。
五.实验过程:1.编程: 用C 语言编出牛顿法的源程序。
2. 开机, 打开C 语言编译程序,键入所编程序源代码.3. 调试程序, 修改错误至能正确运行.六.实验总结:(1)牛顿法收敛速度快,但初值不容易确定,往往由于初值取得不当而使迭代不收敛或收敛慢,但若能保证)()(1+>K K x f x f (称为下山条件),则有可能收敛。
把新的近似值看作初值的话会比原来的取得好,有可能落入局部收敛的邻域。
(2)牛顿法要求)(x f '在x 附近不为零。
亦即x 只能是单根, 不能求重根。
可用重根加速收敛法求重根。
(3)牛顿法的每一步迭代中,都要计算一次导数值,若计算)(x f '比计算函数的近似值要麻烦的多。
计算方法实验报告_列主元高斯消去法
row_first=A[i][i]; for(int j=0;j<n+1;j++)
计算方法实验报告
{ A[i][j]=A[i][j]/row_first;
} }
for(int k=n-1;k>0;k--) {
for(int i=0;i<N;i++) {
for(int j=0;j<N;j++) {
A_B[i][j]=A[i][j]; } A_B[i][N]=B[i][0]; } return A_B; }
3
//输出矩阵 A 的 row x col 个元素 void Show_Matrix(double **A,int row,int col) {
for(int i=0;i<N;i++)
{
int row=Choose_Colum_Main_Element(N,A_B,i);
if(Main_Element<=e) goto A_0;
Exchange(A_B,N+1,row,i);
Elimination(N,A_B,i);
cout<<"选取列主元后第"<<i+1<<"次消元:"<<endl;
double factor; for(int i=start+1;i<n;i++) {
factor=A[i][start]/A[start][start]; for(int j=start;j<n+1;j++) {
计算实验实习报告
计算实验实习报告一、引言计算实验是计算机科学与技术专业的学生在校期间进行的一项重要实践活动。
通过计算实验实习,学生能够将课堂所学的理论知识应用于实际项目中,培养解决实际问题的能力。
本报告旨在总结和分析我在计算实验实习中的学习和体会。
二、实习内容1. 实习目标本次计算实验实习的主要目标是通过进行实际项目的开发,熟悉并掌握某种特定编程语言和相应的开发工具和框架。
在实习过程中,我需要使用该编程语言实现指定的功能,并将其集成到一个完整项目中。
2. 实习任务实习任务包括需求分析、系统设计、编码实现和项目测试。
根据要求,我以团队合作的方式与其他同学一起完成了一个在线购物系统的开发。
3. 实习过程在实习开始之前,我们首先进行了需求分析,明确了该在线购物系统的功能和性能要求。
之后,我们进行了系统设计,包括数据库设计、界面设计和系统架构设计等。
随后,我们按照设计方案实现了系统的各个功能模块,并进行了集成测试和系统测试。
4. 实习成果通过本次实习,我熟悉了编程语言的基本语法和常用库函数,并掌握了使用开发工具和框架进行项目开发的方法。
我在项目中负责实现了系统的用户管理模块和商品管理模块,并成功将它们集成到了整个系统中。
三、实习收获1. 专业技能通过实习,我对编程语言的掌握更加熟练,能够运用所学知识解决实际问题。
我学会了如何进行系统设计和项目开发,并提升了自己的团队协作能力。
此外,我还学习了项目测试的方法和技巧。
2. 实践经验本次实习不仅让我学到了更多的专业知识,还提高了我的实践能力。
通过实际动手的操作,我对计算机软件开发过程有了更加深入的理解,对项目管理和团队协作的经验也得到了积累。
3. 团队合作在实习过程中,我与队友紧密合作,共同解决了项目中的各种技术和团队协作问题。
通过团队合作,我学会了倾听他人意见、有效沟通和协调团队关系,这些能力对于今后的工作和学习都具有重要意义。
四、实习感想通过本次计算实验实习,我对自己的专业选择更加坚定了信心。
计算方法实验报告(2)----Gauss列主元法
计算方法实验报告实验名称:班级:学生姓名:学号:班级序号:课内序号:指导老师:2018-2019学年第2学期一、实验名称:Gauss消去法二、实验学时: 2学时三、实验目的和要求1、掌握高斯列主元法基础原理2、掌握高斯列主元法解方程组的步骤3、能用程序语言对Gauss列主元法进行编程实现四、实验过程代码及结果1、代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication_Gauss{public class GaussBase{private double[,] a;public double[,] A{get { return a; }set { a = value; }}private double[] x;public double[] X{get { return x; }set { x = value; }}public int n;public void CalcuX(){for (int i = n - 1; i >= 0; i--){double sum = 0;for (int j = i + 1; j < n; j++){sum += a[i, j] * x[j];}x[i] = (a[i, n] - sum) / a[i, i];}}public virtual void CalcuA(){}public void Output(){for (int i = 0; i < n; i++){//string s="";for (int j = 0; j <= n; j++){//s += string.Format("{0,-4}", a[i, j]);Console.Write("{0,6}", a[i, j]);}Console.WriteLine();}}public void Output(bool isX){Console.WriteLine("------最终的解为:----------");for (int i = 0; i < n; i++){Console.WriteLine("x[{0}]={1}", i, x[i]);}}public void Input(){Console.WriteLine("请输入方程阶数N:");n = int.Parse(Console.ReadLine());a = new double[n, n + 1];x = new double[n];Console.WriteLine("请输入方程系数A(i,j):");for (int i = 0; i <= n - 1; i++){string s = Console.ReadLine();string[] ss = s.Split(' ');for (int j = 0; j <= n; j++){a[i, j] = Convert.ToDouble(ss[j]);}}}public void Calcu(){//Input();Console.WriteLine("------原始的矩阵为:----------");Output();CalcuA();Console.WriteLine("------应用高斯列主元法消元之后的矩阵A(i,j)为:----------");Output();CalcuX();Output(true);}public class GaussCol : GaussBase{public int FindMaxCol(int k){int ik = k;for (int i = k; i < n; i++){if (Math.Abs(A[i, k]) > Math.Abs(A[ik, k])){ik = i;}}if (A[ik, k] == 0) return -1;if (ik != k){for (int j = k; j <= n; j++){double t = A[ik, j];A[ik, j] = A[k, j];A[k, j] = t;}}return ik;}public override void CalcuA(){for (int k = 0; k < n - 1; k++){//-----------------------------------------int ik = FindMaxCol(k);//------------------------------------for (int i = k + 1; i < n; i++){//double Lik = a[i, k] / a[k, k];// for (int j = k ; j <= n; j++)for (int j = n; j >= k; j--){A[i, j] = A[i, j] - A[i, k] / A[k, k] * A[k, j];}//a[i, k] = 0;}//Output}}}class Program{static void Main(string[] args){GaussBase obj = new GaussCol();obj.Input();obj.Calcu();Console.ReadLine();}}}}2、结果:。
《计算方法》实验报告材料
double Newton(double x,vector<double>&X,vector<double>&Y);
int main(){
char a='n';
do{
int n;
cout<<"请输入插值点个数:"<<endl;
for(int i=0;i<N;i++){
X[i]=p;
Y[i]=1/(1+p*p);
p=p+c;
}
cout<<"请输入要求值x的值:"<<endl;
double x;
cin>>x;
double result=fenduan(N,X,Y,x,c);
cout<<"由分段线性插值法得出结果: "<<result<<endl;
cin>>n;
vector<double>X(n,0);
vector<double>Y(n,0);
cout<<"请输入插值点对应的值及函数值(Xi,Yi):"<<endl;
for(int i=0;i<n;i++){
cin>>X[i]>>Y[i];
}
cout<<"请输入要求值x的值:"<<endl;
哈工大计算方法实验报告
,n,ix≠,n)x0,1,,n,且函数()f x充分光滑,0)(()nx x x x x x ---,n;插值点程序设计流程开始结束输入(x i ,y i ),ni=0,1,2,…,nL=0 i=0xl=1xl=*xlj=0,1,…,i-1,i+1,…,nL=L+xl *i=n?输出y否是i=i+1式摆动——Runge现象,有时多项式摆动可以通过谨慎选择基础函数的取样点来减小。
通常采用分段插值可以很好的消除多项式摆动现象。
2. 对实验2存在的问题的回答,试加以说明在分段段数相同的情况下,插值区间越大,误差越大。
原因是大部分情况下,相对于比较大的区间,函数在比较小的区间上的函数值变化较缓和,因此即使出现摆动也不会偏离原函数太大。
3. 对实验3存在的问题的回答,试加以说明第一问中已经提到多项式摆动可以通过谨慎选择基础函数的取样点来减小。
我们来看下x k=cos (2k+1)π/2(n+1) ,k=0,1,…,n的分布和f(x)=1/(1+x2 )的图像:可以看出,xk的分布是两端密集中间稀疏,f(x)的趋势是两边陡峭中间平缓,函数变化陡峭时节点增多正好可以增加插值的准确性。
4. 如何理解插值问题中的内插和外推?一般来说,内插时插值收敛于实际函数,一旦超出内插的范围,插值函数会发散,且离插值区间越远外推误差越大。
使用不用的插值方法在同一点外推的值也会相差很多,这说明外推本身就存在很大的不确定性。
⎫⎪0,1,2,⎭,k2~4步,直到满程序设计流程定义输入开始输出迭代失败标志输出输出奇异标志结束。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于最小二乘拟合曲线在重力异常资料处理中的应用的试验报告
常用的重力异常资料处理方法有以下类型:圆滑、平均法、趋势分析、空间延拓、导数换算等。
其中圆滑法又分为平均圆滑和多项式圆滑。
平均圆滑能够有效地消除随机误差和干扰,但圆滑后有可能改变异常形态特征,给一些利用异常性态特征进行异常解释的工作带来困难。
多项式圆滑是假设局部区域内有效异常形态能用多项式函数拟合,将偏离这个函数的部分视为误差或干扰。
(1) 剖面数据多项式圆滑
假设在一个局部区域内异常圆滑值可用多项式
表示,则有
在x 附近的局部区域[x-M Δx, x+M Δx]内圆滑异常用该函数拟合。
若取 N 阶多项式拟合异常,有
令
这样,共有N+1个未知变量,2M+1个方程,写成矩阵形式为
显然,多项式阶次越高,对异常数据拟合越好。
一般情况下,希望圆滑值不要过于逼近原始值,否则,不能取得圆滑效果。
另一方面,为了保证方程组可解,通常要求N≤ 2M ,即保持正定或超定。
实际中,位场异常数据的多项式圆滑阶次很少超过3次,即N≤3。
以五点二次(即M=2, N=2)圆滑为例,如此所构成的是一个超定方程组,可用最小二乘方法求解。
+++=2210)(x a x a a x f +++=∆2210)(x a x a a x g []M M M M i x i x a x i x a x i x a a x i x g N N ),1(,,2,1,0,1,),1(,)()()()(2210-----=∆⋅+++∆⋅++∆⋅++=∆⋅+∆ ∑
+=-=∆=+=∆-+-=111,)(12,,2,1,)1(N j j i ij i i i x u x g g M i x i M x x ⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡==⋅++++++++)1)(12(1)12()1(22221)1(11211)1(10)12(1221,,N M M N N N N M M u u u u u u u u a a a g g g U X G G X U
根据最小二乘法,有
考虑到数据点的对称分布,上式改写成
有
实际计算时,采用窗口内的异常点进行圆滑,若将坐标作一下替换
则有
显然,每移动一次计算窗口,仅x=0时的圆滑值是所需计算,其它坐标上圆滑不需要考虑。
从上式可知,当x=0时,只需解出a0即可得到窗口中心点的圆滑值,即
五点二次圆滑计算公式为
同理,可以导出三点二次、七点二次、七点三次九点三次圆滑计算公式。
无论几点圆滑公式,事实上是计算点周边点上异常值的加权之和。
2525105222210221
21101)()()(x a x a a x g x a x a a x g x a x a a x g ++=∆++=∆++=∆ min )]([5
122210→∆-++=Φ∑=i i i i x g x a x a a min ][22
22210→-++=Φ∑-=i i i i g x a x a a ⎪⎪⎪⎩⎪⎪⎪⎨⎧=++=++=++⇒⎪⎪⎪⎪⎭
⎪⎪⎪⎪⎬⎫=-++=∂Φ∂=-++=∂Φ∂=-++=∂Φ∂∑
∑∑∑∑∑∑∑∑∑∑∑∑∑-=-=-=-=-=-=-=-=-=-=-=-=-=-=2222242223122202222322221220222222221022222102222210122221000][20][20][2i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i x g x a x a x a x g x a x a x a g x a x a a x g x a x a a a x g x a x a a a g x a x a a a 2,1,0,1,2++--=x ⎪⎩⎪⎨⎧+++--=+++++--=++++++=++++--++--++--)44(34010)22(0100)(10021012202101212101220g g g g g a a g g g g g a g g g g g a a )](3)(1217[351)0(221100+-+-+-++==∆g g g g g a g ))]}2()2([(3))()([12)(17{351)(x x g x x g x x g x x g x g x g ∆+∆+∆-∆-∆+∆+∆-∆+∆=∆
(2) 平面多项式圆滑
与剖面圆滑类似,用二维多项式模拟异常,即
用同样的方法,可以导出平面圆滑计算公式,如九点二次圆滑公式如下:
同理,可以导出二十五点二次、四十九点二次、二十五点三次、四十九点三次圆滑计算公式。
现就一具体问题应用matlab 的polyfit 函数来进行试验:
eg1. 用二次多项式拟合数据:
x=[0.1 0.4 0.5 0.7 0.7 0.9];
y=[0.61 0.92 0.99 1.52 1.47 2.03];
并作出数据点和拟合曲线图。
解:用polyfit 求二次多项式的系数,作出曲线图,程序如下:
clear,clf,clc
x=[0.1 0.4 0.5 0.7 0.7 0.9];
y=[0.61 0.92 0.99 1.52 1.47 2.03];
cc=polyfit(x,y,2) %求出A 与B 的系数
二次项的系数为:
xx=x(1):0.1:x(length(x));
yy=polyval(cc,xx);
plot(xx,yy,'--')
hold on
plot(x,y,'x')
axis([0,1,0,3])
xlabel('x')
ylabel('y')
作图如下:
25423210),(y a xy a x a y a x a a y x g +++++=∆)]},(),((),(),([()],(),(),(),([2),(5{91),(y y x x g y y x x g y y x x g y y x x g y y x g y y x g y x x g y x x g y x g y x g ∆+∆-∆+∆+∆+∆+∆-∆+∆+∆-∆-∆-∆+∆+∆-∆+∆+∆+∆-∆+∆=∆919291929592
919291----
eg2.给定一组数据点如下:
t=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16];
y=[4.00 6.40 8.00 8.80 9.22 9.50 9.70 9.86 10.00 10.20 10.32 10.42 10.50 10.55 10.58 10.60]*10.^(-3);
求其最小二乘拟合曲线。
解:作出散点图,观察散点图易知变量t 、y 不成线性关系,但是近似成y=βe t
α关系,或成t
b a y +=1关系。
对于近似成y=βe t
α关系,令:
Y=log(y), B=log(β), T=1/t, A=α.
则有:Y=AT+B
程序:
clear,clf,clc
t=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16];
y=[4.00 6.40 8.00 8.80 9.22 9.50 9.70 9.86 10.00 10.20 10.32 10.42 10.50 10.55 10.58 10.60]*10.^(-3);
plot(t,y,'.')
C=polyfit(1./t,log(y),1) %求出A 与B 的系数
t1=1:0.1:16;
y1=exp(-4.4807)*exp(-1.0567*1./t1);
hold on
plot(t1,y1,'--') %绘出y与t的近似函数关系曲线图
grid on
作图如下:
可以看到拟合曲线效果非常好。
从上面第二个例子还可以看出,在重力异常资料处理方法中,有些很接近指数形式的拟合曲线可以先化成指数形式,然后再化成多项式,利用matlab的polyfit函数求出系数,最后画出拟合曲线,拟合效果会更佳。