计算方法实验报告.doc

合集下载

计算方法实验报告

计算方法实验报告

计算方法实验报告计算方法实验报告概述:计算方法是一门研究如何用计算机解决数学问题的学科。

在本次实验中,我们将学习和应用几种常见的计算方法,包括数值逼近、插值、数值积分和常微分方程求解。

通过实验,我们将深入了解这些方法的原理、应用场景以及其在计算机科学和工程领域的重要性。

数值逼近:数值逼近是一种通过使用近似值来计算复杂函数的方法。

在实验中,我们通过使用泰勒级数展开和牛顿迭代法等数值逼近技术,来计算函数的近似值。

这些方法在科学计算和工程领域中广泛应用,例如在信号处理、图像处理和优化问题中。

插值:插值是一种通过已知数据点来估算未知数据点的方法。

在实验中,我们将学习和应用拉格朗日插值和牛顿插值等方法,以及使用这些方法来构造函数的近似曲线。

插值技术在数据分析、图像处理和计算机图形学等领域中具有重要的应用价值。

数值积分:数值积分是一种通过将函数曲线划分为小矩形或梯形来估算函数的积分值的方法。

在实验中,我们将学习和应用矩形法和梯形法等数值积分技术,以及使用这些方法来计算函数的近似积分值。

数值积分在物理学、金融学和统计学等领域中被广泛使用。

常微分方程求解:常微分方程求解是一种通过数值方法来求解微分方程的方法。

在实验中,我们将学习和应用欧拉法和龙格-库塔法等常微分方程求解技术,以及使用这些方法来求解一些常见的微分方程。

常微分方程求解在物理学、生物学和工程学等领域中具有广泛的应用。

实验结果:通过实验,我们成功地应用了数值逼近、插值、数值积分和常微分方程求解等计算方法。

我们得到了准确的结果,并且在不同的应用场景中验证了这些方法的有效性和可靠性。

这些实验结果将对我们进一步理解和应用计算方法提供重要的指导和支持。

结论:计算方法是计算机科学和工程领域中的重要学科,它提供了解决复杂数学问题的有效工具和方法。

通过本次实验,我们深入了解了数值逼近、插值、数值积分和常微分方程求解等计算方法的原理和应用。

这些方法在科学研究、工程设计和数据分析等领域中具有广泛的应用价值。

数学计算方法实验报告

数学计算方法实验报告

数学计算方法实验报告习题二2.估计用二分法求方程f(x)=x3+4x2-10=0在区间[1,2]内根的近似值,为使方程不超过10时所需的二分次数。

f(x k)程序过程:function two (tolerance)a=1;b=2;counter=0;while (abs(b-a)>tolerance)c=(a+b)/2;fa=a^3+4*a^2-10;fb=b^3+4*b^2-10;fc=c^3+4*c^2-10;if ((fa==0|fb==0)) disp(counter);elseif (fa*fc<0)b=c;counter=counter+1;elseif (fb*fc<0)a=c;counter=counter+1;elseif (fb==0)disp(counter);endendsolution=(a+b)/2;disp(solution);disp(counter);实验结果:6.取x0=1.5,用牛顿迭代法求第三中的方程根.f(x)=x3+4x2-10=0的近似值(精确到||x k+1-x k|≦10-5,并将迭代次数与3题比较。

程序过程:function six (g)a=1.5;fa=a^3+4*a^2-10;ga=3*a^2+8*a;b=a-fa/ga;k=1;while(abs(b-a)>g)a=b;fa=a^3+4*a^2-10;ga=3*a^2+8*a;b=a-fa/ga;k=k+1;endformat long;disp(a);disp(k);实验结果:程序结果计算结果8.用弦割法求方程f(x)=x3-3x2-x+9=0在区间[-2,-1]内的一个实根近似值x k,|f(x k)|≦10-5.程序过程:function eight (t)a=-2;b=-1;fa=a^3-3*a^2-a+9;fb=b^3-3*b^2-b+9;c=b-fb*(b-a)/(fb-fa);k=1;while(abs(c-b)>t)a=b;b=c;fa=a^3-3*a^2-a+9;fb=b^3-3*b^2-b+9;c=b-fb*(b-a)/(fb-fa);k=k+1;endformat long;disp(k);disp(b);实验结果: 计算结果9.用艾特肯算法求方程x3+4x2-10=0在区间[1,2]内的根的近似值(取x0=1.5,g(x)=410 x ,精确到|x k+1-x k |≦10-5,并与2,3,6结果比较。

计算方法_实验报告

计算方法_实验报告

一、实验目的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++)实现。

计算方法实验报告册

计算方法实验报告册

实验一——插值方法实验学时: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)调用上述函数,实现样条插值。

数值计算方法实验报告

数值计算方法实验报告

数值计算方法实验报告实验目的:通过实验验证不同数值计算方法在求解数学问题时的精度和效率,并分析其优缺点。

实验原理:实验内容:本实验选取了三个典型的数值计算问题,并分别采用了二分法、牛顿迭代法和梯度下降法进行求解。

具体问题和求解方法如下:1. 问题一:求解方程sin(x)=0的解。

-二分法:利用函数值的符号变化将解空间不断缩小,直到找到满足精度要求的解。

-牛顿迭代法:通过使用函数的斜率来逼近方程的解,并不断逼近真实解。

-梯度下降法:将方程转化为一个极小化问题,并利用梯度下降的方式逼近极小值点,进而找到方程的解。

2.问题二:求解函数f(x)=x^2-3x+2的极小值点。

-二分法:通过确定函数在一个区间内的变化趋势,将极小值所在的区间不断缩小,从而找到极小值点。

-牛顿迭代法:通过使用函数的导数和二阶导数来逼近极小值点,并不断逼近真实解。

-梯度下降法:将函数转化为一个极小化问题,并利用梯度下降的方式逼近极小值点,进而找到函数的极小值点。

3. 问题三:求解微分方程dy/dx = -0.1*y的解。

-二分法:通过离散化微分方程,将微分方程转化为一个差分方程,然后通过迭代计算不同点的函数值,从而得到函数的近似解。

-牛顿迭代法:将微分方程转化为一个积分方程,并通过迭代计算得到不同点的函数值,从而得到函数的近似解。

-梯度下降法:将微分方程转化为一个极小化问题,并利用梯度下降的方式逼近极小值点,从而得到函数的近似解。

实验步骤:1.编写代码实现各个数值计算方法的求解过程。

2.对每个数值计算问题,设置合适的初始值和终止条件。

3.运行程序,记录求解过程中的迭代次数和每次迭代的结果。

4.比较不同数值计算方法的精度和效率,并分析其优缺点。

实验结果:经过实验测试,得到了如下结果:-问题一的二分法迭代次数为10次,求解结果为x=0;牛顿迭代法迭代次数为4次,求解结果为x=0;梯度下降法迭代次数为6次,求解结果为x=0。

-问题二的二分法迭代次数为10次,求解结果为x=1;牛顿迭代法迭代次数为3次,求解结果为x=1;梯度下降法迭代次数为4次,求解结果为x=1-问题三的二分法迭代次数为100次,求解结果为y=e^(-0.1x);牛顿迭代法迭代次数为5次,求解结果为y=e^(-0.1x);梯度下降法迭代次数为10次,求解结果为y=e^(-0.1x)。

东南大学计算方法实验报告

东南大学计算方法实验报告

计算方法与实习实验报告学院:电气工程学院指导老师:***班级: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)是一次式。

计算方法实验报告

计算方法实验报告

计算方法实验报告班级:学号:姓名:时间:成绩:题目:分别用单点弦截法和双点弦截法求方程310x x --=的在1.5附近的根,并分析比较两种方法。

要求误差不超过410-一、 单点弦截法算法: =-(-) k=0,1,…1) 输入两个相近的初值和,误差限ε,最大允许迭代次数为N2) 设置n=13) 计算=-()4) <ε,则输出x=,停机,否则转(5)5) 若n < N,n+1n,转(3)且(3)式中的为所输入的初始值程序:Private Sub Command1_Click()Dim n As Integersing1 = Text1.Text ‘设置方程的系数sing2 = Text2.Textsing3 = Text3.Textsing4 = Text4.Textsing5 = Text5.Textsing6 = Text6.Textx0 = sing5: x1 = sing6 ‘设置迭代初值Do While Abs(x1 - x0) > 0.0001 ‘迭代过程n = n + 1 ‘迭代次数x2 = x1 - F(x1) * (x1 - Val(Text5.Text)) / (F(x1) - F(Val(Text5.Text))) ‘迭代表达式List1.AddItem "n=" & n & Space(4) & x2x0 = x1x1 = x2LoopText7.Text = x2End Sub二、双点弦截法算法:=-(-)1)输入选定的两个相近的初始值和,误差限ε,最大迭代次数N2)设置n=13)计算=-()4)若<ε,则输出x=,停机,否则转(5)5)若n < N,n+1n,转(3)程序:Private Sub Command2_Click()Dim n As Integerx0 = sing5: x1 = sing6Do While Abs(x1 - x0) > 0.0001n = n + 1x2 = x1 - F(x1) * (x1 - x0) / (F(x1) - F(x0))List2.AddItem "n=" & n & Space(4) & x2x0 = x1x1 = x2LoopText8.Text = x2End Sub其中的全局变量定义以及自定义函数过程程序:全局变量定义:Option ExpliciPublic sing1 As Single, sing2 As Single, sing3 As Single, sing4 As Single, sing5 As Single, sing6 As SinglePublic x0 As Single, x1 As Single, x2 As Single自定义函数过程:Private Function F(x As Single) As SingleF = sing1 * x ^ 3 + sing2 * x ^ 2 + sing3 * x + sing4 End Function运行结果:结果与分析:由程序运行结果可知在精度为10^-4时,单点弦截法的迭代结果为x=1.324723,而双点弦截法的迭代结果为x=1.324718结果分析:用单点弦截法迭代需要5次,而双点弦截法所需的迭代次数为4次。

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

计算方法实验报告实验报告一、求方程fxx3-sinx-12x1的全部根, ε1e-6 1、用一般迭代法; 2、用牛顿迭代法; 并比较两种迭代的收敛速度。

一、首先,由题可求得. 其次,分析得到其根所在的区间。

①令,可得到. ②用一阶导数分析得到和两个函数的增减区间;再用二阶导数分析得到两个函数的拐点以及凹凸区间. ③在直角坐标轴上描摹出和的图,在图上可以看到他们的交点,然后估计交点所在的区间,即是所要求的根的区间。

经过估计,得到根所在的区间为,和. 1、一般迭代法(1)算法步骤设为给定的允许精度,迭代法的计算步骤为①选定初值.由确定函数,得等价形式. ②计算.由迭代公式得.③如果,则迭代结束,取为解的近似值;否则,用代替,重复步骤②和步骤③. (2)程序代码①在区间内,代码clc x0-3.5; 初值iter_max100; 迭代的最大次数ep1e-6; 允许精度k0; while kiter_max k从0开始到iter_max循环x1sinx012*x0-1.1/3; 代入,算出的值if absx1-x0ep 与允许精度作比较break; 条件成立,跳出循环end x0x1; 条件不成立,用代替kk1; k加1 end x_starx1, iterk 为解的近似值,iter为迭代次数运行结果x_star -3.4101 ;iter 14 ②在区间内,代码clc x00.5; 初值iter_max100; 迭代的最大次数ep1e-6; 允许精度k0; while kiter_max k从0开始到iter_max循环x11/12*x0.3-sinx01; 代入,算出的值if absx1-x0ep 与允许精度作比较break; 条件成立,跳出循环end x0x1; 条件不成立,用代替kk1; k加1 end x_starx1, iterk 为解的近似值,iter 为迭代次数结果x_star 0.07696;iter 6 ③在区间内,代码clc x03.5; 初值iter_max100; 迭代的最大次数ep1e-6; 允许精度k0; while kiter_max k从0开始到iter_max循环x1sinx012*x0-1.1/3; 代入,算出的值if absx1-x0ep 与允许精度作比较break; 条件成立,跳出循环end x0x1; 条件不成立,用代替kk1; k加1 end x_starx1, iterk 为解的近似值,iter 为迭代次数运行结果x_star 3.4101 ;iter 10 2、牛顿迭代法(1)算法步骤①选定初值,计算,. ②按公式迭代,得新的近似值,并计算,. ③对于给定的允许精度,如果,则终止迭代,取;否则,,在转回步骤②计算. (2)程序代码①在区间内,clc x1-3.5; 初值k0; while k100 k从0开始到100循环x0x1; 将初值赋给f0x0.3-sinx0-12*x01; 计算f13*x0.2-cosx0-12; 计算x1x0-f0/f1; 计算得到新的近似值if absx1-x0 1.0e-6 与允许精度作比较break; 条件成立,跳出循环end kk1; 条件不成立,k加1 end x_starx1, iterk 为解的近似值,iter为迭代次数运行结果x_star -3.4911;iter 2 ②在区间内,clc x10.5; 初值k0; while k100 k从0开始到100循环x0x1; 将初值赋给f0x0.3-sinx0-12*x01; 计算f13*x0.2-cosx0-12; 计算x1x0-f0/f1; 计算得到新的近似值if absx1-x0 1.0e-6 与允许精度作比较break; 条件成立,跳出循环end kk1; 条件不成立,k加1 end x_starx1, iterk 为解的近似值,iter为迭代次数运行结果x_star 0.07696 ;iter 3 ③在区间内,clc x13.5; 初值k0; while k100 k从0开始到100循环x0x1; 将初值赋给f0x0.3-sinx0-12*x01; 计算f13*x0.2-cosx0-12; 计算x1x0-f0/f1; 计算得到新的近似值if absx1-x0 1.0e-6 与允许精度作比较break; 条件成立,跳出循环end kk1; 条件不成立,k加1 end x_starx1, iterk 为解的近似值,iter为迭代次数运行结果x_star 3.4101;iter 3 3、运行结果x_star iter x_star iter x_star iter 一般迭代3.4101 14 0.7696 6 3.4101 10 牛顿法3.4911 2 0.70696 3 3.4101 3 4、结果分析从这题的结果可以看出,牛顿迭代法的迭代速度比一般迭代法的速度要快,牛顿法的迭代次数比较少。

例如,求在的根时,一般迭代法迭代了14次(iter 14),而牛顿法只用了2次(iter 2)。

总而言之,一般迭代法是一种逐次逼近的方法,具有原理简单、编制程序方便等优点,但存在是否收敛和收敛速度的快慢等问题。

牛顿迭代法是一种特殊的迭代法,用于求方程的单根时具有2阶收敛。

因此是一种求非线性方程解的好方法,还可以用于求重根和复根,而且可以推广到求非线性方程组的解.二、解方程组直接法1、已知对矩阵A做LU分解。

2、用追赶法解下述方程组,并给出n10的结果,其中,1、杜利特尔分解法(直接三角分解法)设方程组的系数矩阵的各阶主子式,则可知该方程组存在唯一的杜利特尔分解,其中,. 我们记矩阵的第行第列元素为,则矩阵的第一行和的第一列可由公式(1.1)求出(2.1)再由公式(2.2)求出的第行、的第列元素(2.2)(1)算法步骤由于系数矩阵的各阶主子式,则可知该方程组存在唯一的杜利特尔分解。

①利用公式(2.1)和(2.2)求出和的元素和。

②求解单位下三角形方程组,即按公式(2.3)求出。

④求解上三角形方程组,即按公式(2.4)可求得方程组的解。

(2)程序代码function [L,U]LUA A [n,n]sizeA; 定义为阶矩阵Lzerosn,n; 矩阵初始化Uzerosn,n; 矩阵初始化for i1n Li,i1; 矩阵的对角线元素为 1 end for k1n for jkn Uk,jAk,j-sumLk,1k-1.*U1k-1,j ; 求出元素end for ik1n Li,kAi,k-sumLi,1k-1.*U1k-1,k /Uk,k; 求出的元素end end A[4 2 1 5;8 7 2 10;4 8 3 6;12 6 11 20]; 矩阵[L,U]LUA 2、追赶法设所求方程组为,(2.5)(1)算法步骤①由方程组的第1个方程,将未知元用表示为记,,得。

①以此类推,用表示,用表示。

我们可以得到一般式(其中记)(2.6)(2.7)②将代入方程组(2.5)的第n个方程,并解出得,上式右端恰好是式(2.6)的。

于是,可由式(2.7)求出三对角方程组的解,即,(2.8)(2)程序代码clc a[0 1 1 1 1 1 1 1 1 1]; b[2 2 2 2 2 2 2 2 2 2]; c[1 1 1 1 1 1 1 1 1 0]; r[-7 -5 -5 -5 -5 -5 -5 -5 -5 -5]; u[0 0 0 0 0 0 0 0 0 0]; v[0 0 0 0 0 0 0 0 0 0]; x[0 0 0 0 0 0 0 0 0 0]; u1r1/b1; 计算v1c1/b1; 计算for k210 ukrk-uk-1*ak/bk-vk-1*ak; 计算vkck/bk-vk-1*ak; 计算end x10u10; for k19 xkuk-vk*xk1; 由,解出end x 运行结果x[-3.5000 -1.0000 -3.0000 -1.6000 -2.8333 -1.8571 -2.7500 -2.0000 -0.8182 -2.0909] 3、运行结果(1)杜利特尔分解法(2)追赶法。

4、结果分析(1)杜利特尔分解法在实现分解后,解具有相同系数矩阵的方程组,非常方便,每解一个方程只需用式(2.3)和式(2.4)解两个三角形方程组即可,大大减少了运算工作量。

另外,矩阵和的元素可采用紧凑格式存放在系数矩阵的相应元素位置上,节省了存储单元。

(2)追赶法追赶法仅适用于三对角方程组的求解。

我们由式(2.6)和式(2.8)可以算出,追赶法的乘、除运算次数仅为,加、减运算次数仅为。

故追赶法具有运算量小和存储量小的优势。

三、解方程组迭代法1、用迭代法解Axb,其中b5,5,,5T,给定误差,用Jacobi和SOR两种迭代法计算,并给出n10的结果。

对于阶方程组,假定系数矩阵的对角元时,可得雅可比迭代格式为,(3.1)记为方程组的系数矩阵的对角元组成的对角阵,和分别为由的元素组成的严格下三角阵和上三角阵,则系数矩阵可分解为. 1、Jacobi(雅可比)迭代法(1)算法步骤①根据矩阵,算出矩阵、和,即,,。

②计算雅可比迭代矩阵. ③计算矩阵. ④代入给出的初值,得到雅可比迭代公式(3.1)的矩阵形式. 3.2 由式(3.2)就可以得到向量序列. (2)程序代码clc A[3 -1/2 -1/4 0 0 0 0 0 0 0;-1/2 3 -1/2 -1/4 0 0 0 0 0 0; -1/4 -1/2 3 -1/2 -1/4 0 0 0 0 0;0 -1/4 -1/2 3 -1/2 -1/4 0 0 0 0; 0 0 -1/4 -1/2 3 -1/2 -1/4 0 0 0;0 0 0 -1/4 -1/2 3 -1/2 -1/4 0 0; 0 0 0 0 -1/4 -1/2 3 -1/2 -1/4 0;0 0 0 0 0 -1/4 -1/2 3 -1/2 -1/4; 0 0 0 0 0 0 -1/4 -1/2 3 -1/2;0 0 0 0 0 0 0 -1/4 -1/2 3]; x0[0 0 0 0 0 0 0 0 0 0] ; 初值b[5 5 5 5 5 5 5 5 5 5] ; L [0 0 0 0 0 0 0 0 0 0;1/2 0 0 0 0 0 0 0 0 0; 1/4 1/2 0 0 0 0 0 0 0 0;0 1/4 1/2 0 0 0 0 0 0 0; 0 0 1/4 1/2 0 0 0 00 0;0 0 0 1/4 1/2 0 0 0 0 0; 0 0 0 0 1/4 1/2 0 0 0 0;0 0 0 0 0 1/4 1/2 0 0 0; 0 0 0 0 0 0 1/4 1/2 0 0;0 0 0 0 0 0 0 1/4 1/2 0]; U[ 0 1/2 1/4 0 0 0 0 0 0 0;0 0 1/2 1/4 0 0 0 0 0 0; 0 0 0 1/2 1/4 0 0 0 0 0;0 0 0 0 1/2 1/4 0 0 0 0; 0 0 0 0 0 1/2 1/4 0 0 0;0 0 0 0 0 0 1/2 1/4 0 0; 0 0 0 0 0 0 0 1/2 1/4 0;0 0 0 0 0 0 0 0 1/2 1/4; 0 0 0 0 0 0 0 0 0 1/2;0 0 0 0 0 0 0 0 0 0]; D[3 0 0 0 0 0 0 0 0 0; 0 3 0 0 0 0 0 0 0 0; 0 0 3 0 0 0 0 0 0 0; 0 0 0 3 0 0 0 0 0 0; 0 0 0 0 3 0 0 0 0 0; 0 0 0 0 0 3 0 0 0 0; 0 0 0 0 0 0 3 0 0 0; 0 0 0 0 0 0 0 3 0 0; 0 0 0 0 0 0 0 0 3 0; 0 0 0 0 0 0 0 0 0 3]; BJinvD*LU; 计算雅可比迭代矩阵FJinvD*b; 计算矩阵N1000; ep1e-10; 误差k0; while kiter_max k从0开始到iter_max循环x1BJ*x0fJ; 计算if normx1-x0, inf ep 与误差做比较break; 满足,跳出循环end x0x1; 不满足,将赋给kk1; k加1 end x_starx1, iterk 2、SOR(超松弛)迭代法(1)算法步骤①根据矩阵,算出矩阵、和,即,,。

相关文档
最新文档