计算方法实验报告

合集下载

数值计算方法实验报告

数值计算方法实验报告

数值计算方法实验报告一、实验介绍本次实验是关于数值计算方法的实验,旨在通过计算机模拟的方法,实现对于数值计算方法的掌握。

本次实验主要涉及到的内容包括数值微积分、线性方程组的求解、插值与拟合、常微分方程的数值解等。

二、实验内容1. 数值微积分数值微积分是通过计算机模拟的方法,实现对于微积分中的积分运算的近似求解。

本次实验中,我们将会使用梯形公式和辛普森公式对于一定区间上的函数进行积分求解,并比较不同公式的计算误差。

2. 线性方程组的求解线性方程组求解是数值计算领域中的重要内容。

本次实验中,我们将会使用高斯消元法、LU分解法等方法对于给定的线性方程组进行求解,并通过比较不同方法的计算效率和精度,进一步了解不同方法的优缺点。

3. 插值与拟合插值与拟合是数值计算中的另一个重要内容。

本次实验中,我们将会使用拉格朗日插值法和牛顿插值法对于给定的数据进行插值求解,并使用最小二乘法对于给定的函数进行拟合求解。

4. 常微分方程的数值解常微分方程的数值解是数值计算中的难点之一。

本次实验中,我们将会使用欧拉法和龙格-库塔法等方法对于给定的常微分方程进行数值解的求解,并比较不同方法的计算精度和效率。

三、实验结果通过本次实验,我们进一步加深了对于数值计算方法的理解和掌握。

在数值微积分方面,我们发现梯形公式和辛普森公式都能够有效地求解积分,但是辛普森公式的计算精度更高。

在线性方程组求解方面,我们发现LU分解法相对于高斯消元法具有更高的计算效率和更好的数值精度。

在插值与拟合方面,我们发现拉格朗日插值法和牛顿插值法都能够有效地进行插值求解,而最小二乘法则可以更好地进行函数拟合求解。

在常微分方程的数值解方面,我们发现欧拉法和龙格-库塔法都能够有效地进行数值解的求解,但是龙格-库塔法的数值精度更高。

四、实验总结本次实验通过对于数值计算方法的模拟实现,进一步加深了我们对于数值计算方法的理解和掌握。

在实验过程中,我们了解了数值微积分、线性方程组的求解、插值与拟合、常微分方程的数值解等多个方面的内容,在实践中进一步明确了不同方法的特点和优缺点,并可以通过比较不同方法的计算效率和数值精度来选择合适的数值计算方法。

计算方法_实验报告

计算方法_实验报告

一、实验目的1. 理解并掌握计算方法的基本概念和原理;2. 学会使用计算方法解决实际问题;3. 提高编程能力和算法设计能力。

二、实验内容本次实验主要涉及以下内容:1. 线性方程组的求解;2. 多项式插值;3. 牛顿法求函数零点;4. 矩阵的特征值和特征向量求解。

三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 科学计算库:NumPy、SciPy四、实验步骤及结果分析1. 线性方程组的求解(1)实验步骤a. 导入NumPy库;b. 定义系数矩阵A和增广矩阵b;c. 使用NumPy的linalg.solve()函数求解线性方程组。

(2)实验结果设系数矩阵A和增广矩阵b如下:A = [[2, 1], [1, 2]]b = [3, 2]解得:x = [1, 1]2. 多项式插值(1)实验步骤a. 导入NumPy库;b. 定义插值点x和对应的函数值y;c. 使用NumPy的polyfit()函数进行多项式拟合;d. 使用poly1d()函数创建多项式对象;e. 使用多项式对象计算插值点对应的函数值。

(2)实验结果设插值点x和对应的函数值y如下:x = [1, 2, 3, 4, 5]y = [1, 4, 9, 16, 25]拟合得到的二次多项式为:f(x) = x^2 + 1在x = 3时,插值得到的函数值为f(3) = 10。

3. 牛顿法求函数零点(1)实验步骤a. 导入NumPy库;b. 定义函数f(x)和导数f'(x);c. 设置初始值x0;d. 使用牛顿迭代公式进行迭代计算;e. 判断迭代结果是否满足精度要求。

(2)实验结果设函数f(x) = x^2 - 2x - 3,初始值x0 = 1。

经过6次迭代,得到函数零点x ≈ 3。

4. 矩阵的特征值和特征向量求解(1)实验步骤a. 导入NumPy库;b. 定义系数矩阵A;c. 使用NumPy的linalg.eig()函数求解特征值和特征向量。

计算方法实验报告

计算方法实验报告

班级:地信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++)实现。

数值计算基础实验报告(3篇)

数值计算基础实验报告(3篇)

第1篇一、实验目的1. 理解数值计算的基本概念和常用算法;2. 掌握Python编程语言进行数值计算的基本操作;3. 熟悉科学计算库NumPy和SciPy的使用;4. 分析算法的数值稳定性和误差分析。

二、实验内容1. 实验环境操作系统:Windows 10编程语言:Python 3.8科学计算库:NumPy 1.19.2,SciPy 1.5.02. 实验步骤(1)Python编程基础1)变量与数据类型2)运算符与表达式3)控制流4)函数与模块(2)NumPy库1)数组的创建与操作2)数组运算3)矩阵运算(3)SciPy库1)求解线性方程组2)插值与拟合3)数值积分(4)误差分析1)舍入误差2)截断误差3)数值稳定性三、实验结果与分析1. 实验一:Python编程基础(1)变量与数据类型通过实验,掌握了Python中变量与数据类型的定义方法,包括整数、浮点数、字符串、列表、元组、字典和集合等。

(2)运算符与表达式实验验证了Python中的算术运算、关系运算、逻辑运算等运算符,并学习了如何使用表达式进行计算。

(3)控制流实验学习了if-else、for、while等控制流语句,掌握了条件判断、循环控制等编程技巧。

(4)函数与模块实验介绍了Python中函数的定义、调用、参数传递和返回值,并学习了如何使用模块进行代码复用。

2. 实验二:NumPy库(1)数组的创建与操作通过实验,掌握了NumPy数组的基本操作,包括创建数组、索引、切片、排序等。

(2)数组运算实验验证了NumPy数组在数学运算方面的优势,包括加、减、乘、除、幂运算等。

(3)矩阵运算实验学习了NumPy中矩阵的创建、操作和运算,包括矩阵乘法、求逆、行列式等。

3. 实验三:SciPy库(1)求解线性方程组实验使用了SciPy库中的线性代数模块,通过高斯消元法、LU分解等方法求解线性方程组。

(2)插值与拟合实验使用了SciPy库中的插值和拟合模块,实现了对数据的插值和拟合,并分析了拟合效果。

计算方法实验报告册

计算方法实验报告册

实验一——插值方法实验学时:4实验类型:设计 实验要求:必修一 实验目的通过本次上机实习,能够进一步加深对各种插值算法的理解;学会使用用三种类型的插值函数的数学模型、基本算法,结合相应软件(如VC/VB/Delphi/Matlab/JAVA/Turbo C )编程实现数值方法的求解。

并用该软件的绘图功能来显示插值函数,使其计算结果更加直观和形象化。

二 实验内容通过程序求出插值函数的表达式是比较麻烦的,常用的方法是描出插值曲线上尽量密集的有限个采样点,并用这有限个采样点的连线,即折线,近似插值曲线。

取点越密集,所得折线就越逼近理论上的插值曲线。

本实验中将所取的点的横坐标存放于动态数组[]X n 中,通过插值方法计算得到的对应纵坐标存放于动态数组[]Y n 中。

以Visual C++.Net 2005为例。

本实验将Lagrange 插值、Newton 插值和三次样条插值实现为一个C++类CInterpolation ,并在Button 单击事件中调用该类相应函数,得出插值结果并画出图像。

CInterpolation 类为 class CInterpolation { public :CInterpolation();//构造函数CInterpolation(float *x1, float *y1, int n1);//结点横坐标、纵坐标、下标上限 ~ CInterpolation();//析构函数 ………… …………int n, N;//结点下标上限,采样点下标上限float *x, *y, *X;//分别存放结点横坐标、结点纵坐标、采样点横坐标float *p_H,*p_Alpha,*p_Beta,*p_a,*p_b,*p_c,*p_d,*p_m;//样条插值用到的公有指针,分别存放i h ,i α,i β,i a ,i b ,i c ,i d 和i m};其中,有参数的构造函数为CInterpolation(float *x1, float *y1, int n1) {//动态数组x1,y1中存放结点的横、纵坐标,n1是结点下标上限(即n1+1个结点) n=n1;N=x1[n]-x1[0]; X=new float [N+1]; x=new float [n+1]; y=new float [n+1];for (int i=0;i<=n;i++) {x[i]=x1[i]; y[i]=y1[i]; }for (int i=0;i<=N;i++) X[i]=x[0]+i; }2.1 Lagrange 插值()()nn i i i P x y l x ==∑,其中0,()nj i j j ni jx x l x x x =≠-=-∏对于一个自变量x ,要求插值函数值()n P x ,首先需要计算对应的Lagrange 插值基函数值()i l x float l(float xv,int i) //求插值基函数()i l x 的值 {float t=1;for (int j=0;j<=n;j++) if (j!=i)t=t*(xv-x[j])/(x[i]-x[j]); return t; }调用函数l(float x,int i),可求出()n P xfloat p_l(float x) //求()n P x 在一个点的插值结果 {float t=0;for (int i=0;i<=n;i++) t+=y[i]*l(x,i); return t; }调用p_l(float x)可实现整个区间的插值float *Lagrange() //求整个插值区间上所有采样点的插值结果 {float *Y=new float [N+1]; for (int k=0;k<=N;k++) Y[k]=p_l(x[0]+k*h); return Y; } 2.2Newton 插值010()(,,)()nn i i i P x f x x x x ω==∑,其中101,0()(),0i i j j i x x x i ω-==⎧⎪=⎨-≠⎪⎩∏,0100,()(,,)()ik i nk k j j j kf x f x x x x x ==≠=-∑∏对于一个自变量x ,要求插值函数值()n P x ,首先需要计算出01(,,)i f x x x 和()i x ωfloat *f() {//该函数的返回值是一个长度为n +1的动态数组,存放各阶差商 }float w(float x, int i) {//该函数计算()i x ω }在求()n P x 的函数中调用*f()得到各阶差商,然后在循环中调用w(float x)可得出插值结果 float p_n(float x) {//该函数计算()n P x 在一点的值 }调用p_n(float x)可实现整个区间的插值 float *Newton() {//该函数计算出插值区间内所有点的值 }2.3 三次样条插值三次样条插值程序可分为以下四步编写: (1) 计算结点间的步长i hi 、i α、i β;(2) 利用i hi 、i α、i β产生三对角方程组的系数矩阵和常数向量; (3) 通过求解三对角方程组,得出中间结点的导数i m ; (4) 对自变量x ,在对应区间1[,]i i x x +上,使用Hermite 插值; (5)调用上述函数,实现样条插值。

计算课实验报告总结(3篇)

计算课实验报告总结(3篇)

第1篇一、实验背景随着信息技术的飞速发展,计算课已成为现代教育中不可或缺的一部分。

通过计算课的学习,学生可以掌握计算机基本操作、编程语言以及算法设计等知识,为今后从事相关工作奠定基础。

本次实验旨在通过实际操作,加深对所学知识的理解,提高动手能力和团队协作能力。

二、实验目的1. 熟悉计算机基本操作,掌握常用软件的使用方法;2. 学习一种编程语言,理解编程思想,实现基本算法;3. 培养团队协作精神,提高动手实践能力;4. 提高对计算课重要性的认识,激发学习兴趣。

三、实验内容本次实验主要包括以下内容:1. 计算机基本操作:熟练使用计算机操作系统,掌握文件管理、系统设置等基本操作;2. 编程语言学习:选择一种编程语言(如Python、Java等),学习基本语法、数据结构、算法等知识;3. 算法实现:设计并实现一个简单算法,如排序、查找等;4. 项目实践:分组完成一个小型项目,如制作一个简单的网页、编写一个计算器程序等。

四、实验过程1. 实验准备:了解实验内容,预习相关理论知识,准备好实验所需的计算机和软件;2. 实验操作:按照实验指导书进行操作,记录实验步骤和结果;3. 团队协作:分组讨论,分工合作,共同完成实验任务;4. 结果分析:对实验结果进行分析,总结经验教训。

五、实验结果与分析1. 计算机基本操作:通过实验,掌握了计算机基本操作,如文件管理、系统设置等,提高了计算机应用能力;2. 编程语言学习:学习了所选编程语言的基本语法、数据结构、算法等知识,为今后深入学习打下了基础;3. 算法实现:实现了排序、查找等基本算法,加深了对算法原理的理解;4. 项目实践:分组完成了一个小型项目,如制作了一个简单的网页、编写了一个计算器程序等,提高了团队协作能力和动手实践能力。

六、实验总结1. 计算课实验对提高学生计算机应用能力具有重要意义,有助于培养学生动手实践能力和团队协作精神;2. 实验过程中,要注重理论与实践相结合,不断总结经验教训,提高实验效果;3. 在今后的学习中,要继续努力,深入学习计算课相关知识,为将来从事相关工作打下坚实基础。

计算方法实验报告习题2(浙大版)

计算方法实验报告习题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 。

计算方法实验报告(附代码)

计算方法实验报告(附代码)

实验一 牛顿下山法实验说明:求非线性方程组的解是科学计算常遇到的问题,有很多实际背景.各种算法层出不穷,其中迭代是主流算法。

只有建立有效的迭代格式,迭代数列才可以收敛于所求的根。

因此设计算法之前,对于一般迭代进行收敛性的判断是至关重要的。

牛顿法也叫切线法,是迭代算法中典型方法,只要初值选取适当,在单根附近,牛顿法收敛速度很快,初值对于牛顿迭代 至关重要。

当初值选取不当可以采用牛顿下山算法进行纠正。

牛顿下山公式:)()(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 迭代算法流程图实验二 高斯-塞德尔迭代法实验说明:线性方程组大致分迭代法和直接法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中北大学信息商务学院计算方法实验报告学生姓名:刘昊文学号: 30学院:中北大学信息商务学院专业:电气工程及其自动化指导教师:薛晓健2017 年 04 月 19 日实验一:非线性方程的近似解法1.实验目的1.掌握二分法和牛顿迭代法的原理2.根据实验内容编写二分法和牛顿迭代法的算法实现注:(可以用C语言或者matlab语言)2.实验设备matlab3.实验内容及步骤解方程f(x)=x5-3x3-2x2+2=04.实验结果及分析二分法:数据:f =x^5-3*x^3-2*x^2+2[ n xa xb xc fc ]1 -3 3 02 0牛顿迭代法> syms x;f=(x^5-3*x^3-2*x^2+2)[x,k]=Newtondd(f,0,1e-12)f = x^5 - 3*x^3 - 2*x^2 + 2x = NaNk =2实验二:解线性方程组的迭代法1.实验目的1.掌握雅克比迭代法和高斯-塞德尔迭代法的原理2.根据实验内容编写雅克比迭代法和高斯-塞德尔迭代法的算法实现注:(可以用C语言或者matlab语言)2.实验设备Matlab3.实验内容及步骤1、分别用雅克比迭代法和高斯-塞德尔迭代法解方程Ax=b其中A=[4 -1 0 -1 0 0-1 4 -1 0 -1 00 -1 4 -1 0 -1-1 0 -1 4 -1 00 -1 0 -1 4 -10 0 -1 0 -1 4]b=[0 ;5;-2;5;-2;6]4.实验结果及分析(雅克比迭代法)a=[4 -1 0 -1 0 0;-1 4 -1 0 -1 0;0 -1 4 -1 0 -1;-1 0 -1 4 -1 0;0 -1 0 -1 4 -1;0 0 -1 0 -1 4] b=[0;5;-2;5;-2;6]x=agui_jacobi(a,b)a = 4 -1 0 -1 0 0-1 4 -1 0 -1 00 -1 4 -1 0 -1-1 0 -1 4 -1 00 -1 0 -1 4 -10 0 -1 0 -1 4b = 0 5 -2 5 -2 60 k = 2k = 3k = 4k = 5k = 6k = 7k = 8k = 9k = 10k = 11k = 12k = 13k = 14k = 15k = 16k = 17k = 18k = 19k = 20k = 21k = 22k = 24k = 25k = 26k = 27x =(高斯-赛德尔迭代法迭代法)a=[4 -1 0 -1 0 0;-1 4 -1 0 -1 0;0 -1 4 -1 0 -1;-1 0 -1 4 -1 0;0 -1 0 -1 4 -1;0 0 -1 0 -1 4] b=[0;5;-2;5;-2;6]x= agui_GS(a,b)a = 4 -1 0 -1 0 0-1 4 -1 0 -1 00 -1 4 -1 0 -1-1 0 -1 4 -1 00 -1 0 -1 4 -10 0 -1 0 -1 4b = 0 5 -2 5 -2 6k = 1Columns 1 through 5 0Column 6k = 2Columns 1 through 5 Column 6k = 3Columns 1 through 5 Column 6k = 4Columns 1 through 5 Column 6k = 5Columns 1 through 5 Column 6k = 6Columns 1 through 5 Column 6k = 7Columns 1 through 5 Column 6k = 8Columns 1 through 5Column 6k = 9Columns 1 through 5 Column 6k = 10Columns 1 through 5 Column 6k = 11Columns 1 through 5 Column 6k = 12Columns 1 through 5 Column 6k = 13Columns 1 through 5 Column 6k = 14Columns 1 through 5 Column 6x =实验三:插值与拟合1.实验目的1、掌握线性插值、抛物线插值、拉格朗日插值,三次样条插值与拟合2、根据实验内容,编写三次样条插值(一阶导数)的算法实现。

3、根据实验内容,编写最小二乘法的算法实现。

2.实验设备Matlab3.实验内容及步骤端点边界条件为第一类边界条件(给定一阶导数):10001087.0'7'0==Y Y4.实验结果及分析结果b1 c1 d142279最小二乘法拟合代码:function p=funLSM(x,y,m)% x,y为序列长度相等的数据向量,m为拟合多项式次数format short;A=zeros(m+1,m+1);for i=0:mfor j=0:mA(i+1,j+1)=sum(x.^i.*y);endb(i+1)=sum(x.^i.*y)enda=A\b';p=fliplr(a')f=polyval(p,x)plot(x,y,'b*',x,f,'r--');disp('拟合方程系数按照降幂排列如下')一次拟合结果:b =b =Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = . > In funLSM at 11p = 1 0f =拟合方程系数按照降幂排列如下p = 1 0二次拟合结果b =b =b =Warning: Matrix is singular to working precision. > In funLSM at 11p = NaN NaN NaNf = NaN NaN NaN NaN NaN NaN NaN NaN拟合方程系数按照降幂排列如下p = NaN NaN NaN实验四:数值积分1.实验目的1、掌握牛顿-柯特斯求积公式、梯形公式、辛普生公式及误差(余项)。

2、根据实验内容,编写复合梯形公式、复合辛普生公式的算法实现。

2.实验设备Matlab3.实验内容及步骤1、用复合梯形公式和辛普生公式求下面两式的积分(误差要求5e-8)(1)⎰21x xe(2)⎰+1214x 4.实验结果及分析复化梯形积分代码:function [t]=agui_trapz(fname,d2fname,a,b,e)%fname 为北极函数,d2fname 为函数fname 的二阶导函数,a,b 分别为上下界,e 为精度y=abs(feval(d2fname,a:1e-5:b));m=max(y);h=abs(sqrt(12*e/(b-a)./m));n=ceil((b-a)/h)h=(b-a)/n;fa=feval(fname,a);fb=feval(fname,b);f=feval(fname,a+h:h:b-h+*h);t=h**(fa+fb)+sum(f));结果:一:format longt=agui_trapz(inline('x.*exp(x)'),inline('(x+2).*exp(x)'),1,2,5e-8)n = 7019t =二:t=agui_trapz(inline('4./(1+x.^2)'),inline('(-8+24.*x.^2)./(1+x.^2).^3'),0,1,5e-8) n = 3652t =复化辛普生求积公式代码:function[s]=agui_simpson(fname,d4fname,a,b,e)%fname为被积函数,d4fname为函数fname的四阶导函数,a,b分别为上下界,e为精度y=abs(feval(d4fname,a:1e-5:b));m=max(y);h=abs((2880*e/(b-a)./m).^);n=ceil((b-a)/h)h=(b-a)/n;fa=feval(fname,a);fb=feval(fname,b);s=fa-fb;x=a;for i=1:nx=x+h/2;s=s+4*feval(fname,x);x=x+h/2;s=s+2*feval(fname,x);ends=s*h/6;结果:一:t=agui_simpson(inline('x.*exp(x)'),inline('(x+4).*exp(x)'),1,2,5e-8)n = 24t =二:t=agui_simpson(inline('4/(1+x.^2)'),inline('96.*(1-10.*x.^2+5.*x.^4)./(1+x.^2).^5'),0,1,5e-8 )n = 29 t =。

相关文档
最新文档