计算方法实验报告
计算方法_实验报告

一、实验目的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篇)

第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)调用上述函数,实现样条插值。
东南大学计算方法实验报告

计算方法与实习实验报告学院:电气工程学院指导老师:***班级: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)是一次式。
计算课实验报告总结(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 列主元素消去法解方程组 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 。
计算方法-解线性方程组的直接法实验报告

cout<<endl;
for(k=i+1;k<m;k++)
{
l[k][i]=a[k][i]/a[i][i];
for(r=i;r<m+1;r++) /*化成三角阵*/
a[k][r]=a[k][r]-l[k][i]*a[i][r];
}
}
x[m-1]=a[m-1][m]/a[m-1][m-1];
{
int i,j;
float t,s1,s2;
float y[100];
for(i=1;i<=n;i++) /*第一次回代过程开始*/
{
s1=0;
for(j=1;j<i;j++)
{
t=-l[i][j];
s1=s1+t*y[j];
}
y[i]=(b[i]+s1)/l[i][i];
}
for(i=n;i>=1;i--) /*第二次回代过程开始*/
s2=s2+l[i][k]*u[k][r];
l[i][r]=(a[i][r]-s2)/u[r][r];
}
}
printf("array L:\n");/*输出矩阵L*/ for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%7.3f ",l[i][j]);
printf("\n");
{
s2=0;
for(j=n;j>i;j--)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告一、求方程f(x)=x^3-sinx-12x+1的全部根, ε=1e -6 1、 用一般迭代法; 2、 用牛顿迭代法;并比较两种迭代的收敛速度。
一、首先,由题可求得:12cos 3)(2'--=x x x f . 其次,分析得到其根所在的区间。
① 令()0=x f ,可得到x x x sin 1123=+-.② 用一阶导数分析得到1123+-x x 和x sin 两个函数的增减区间;再用二阶导数分析得到两个函数的拐点以及凹凸区间.③ 在直角坐标轴上描摹出01123=+-x x 和0sin =x 的图,在图上可以看到他们的交点,然后估计交点所在的区间,即是所要求的根的区间。
经过估计,得到根所在的区间为[]3,4--,[]1,0和[]4,3.1、 一般迭代法 (1)算法步骤:设ε为给定的允许精度,迭代法的计算步骤为:① 选定初值0x .由()0=x f 确定函数()x g ,得等价形式()x g x =. ② 计算()0x g .由迭代公式得()01x g x =.③ 如果ε≤-01x x ,则迭代结束,取1x 为解的近似值;否则,用1x 代替0x ,重复步骤②和步骤③. (2)程序代码: ① 在区间[]3,4--内, 代码: clcx0=-3.5; %初值0xiter_max=100; %迭代的最大次数 ep=1e-6; %允许精度 ε k=0;while k<=iter_max %k 从0开始到iter_max 循环 x1=(sin(x0)+12*x0-1).^(1/3); %代入0x ,算出1x 的值 if abs(x1-x0)<ep %01x x -与允许精度作比较 break ; %条件ε≤-01x x 成立,跳出循环 endx0=x1; %条件ε≤-01x x 不成立,用1x 代替0x k=k+1; %k 加1 endx_star=x1, iter=k %1x 为解的近似值,iter 为迭代次数 运行结果:x_star = -3.4101 ;iter =14②在区间[]1,0内,代码: clcx0=0.5; %初值0xiter_max=100; %迭代的最大次数 ep=1e-6; %允许精度ε k=0;while k<=iter_max %k 从0开始到iter_max 循环 x1=(1/12)*(x0.^3-sin(x0)+1); %代入0x ,算出1x 的值if abs(x1-x0)<ep %01x x -与允许精度作比较 break ; %条件ε≤-01x x 成立,跳出循环 endx0=x1; %条件ε≤-01x x 不成立,用1x 代替0x k=k+1; %k 加1 endx_star=x1, iter=k %1x 为解的近似值,iter 为迭代次数 结果:x_star = 0.07696;iter =6③在区间[]4,3内, 代码: clcx0=3.5; %初值0xiter_max=100; %迭代的最大次数 ep=1e-6; %允许精度ε k=0;while k<=iter_max %k 从0开始到iter_max 循环 x1=(sin(x0)+12*x0-1).^(1/3); %代入0x ,算出1x 的值 if abs(x1-x0)<ep %01x x -与允许精度作比较 break ; %条件ε≤-01x x 成立,跳出循环 endx0=x1; %条件ε≤-01x x 不成立,用1x 代替0x k=k+1; %k 加1 endx_star=x1, iter=k %1x 为解的近似值,iter 为迭代次数 运行结果:x_star = 3.4101 ;iter =102、 牛顿迭代法 (1)算法步骤:① 选定初值0x ,计算()0x f ,()0'x f .② 按公式()()k k k k x f x f x x '1-=+迭代,得新的近似值1+k x ,并计算()1+k x f ,()1'+k x f . ③ 对于给定的允许精度ε,如果ε≤-+k k x x 1,则终止迭代,取1*+≈k x x ;否则,1+=k k ,在转回步骤②计算.(2)程序代码: ①在区间[]3,4--内, clcx1=-3.5; %初值1x k=0;while k<=100 %k 从0开始到100循环 x0=x1; %将初值1x 赋给0xf0=x0.^3-sin(x0)-12*x0+1; %计算()0x f f1=3*x0.^2-cos(x0)-12; %计算()0'x f x1=x0-f0/f1; %计算得到新的近似值1xif abs(x1-x0)< 1.0e-6 %01x x -与允许精度作比较 break ; %条件ε≤-01x x 成立,跳出循环 endk=k+1; %条件ε≤-01x x 不成立,k 加1endx_star=x1, iter=k %1x 为解的近似值,iter 为迭代次数 运行结果:x_star = -3.4911;iter =2②在区间[]1,0内, clcx1=0.5; %初值1x k=0;while k<=100 %k 从0开始到100循环 x0=x1; %将初值1x 赋给0xf0=x0.^3-sin(x0)-12*x0+1; %计算()0x f f1=3*x0.^2-cos(x0)-12; %计算()0'x f x1=x0-f0/f1; %计算得到新的近似值1xif abs(x1-x0)< 1.0e-6 %01x x -与允许精度作比较 break ; %条件ε≤-01x x 成立,跳出循环 endk=k+1; %条件ε≤-01x x 不成立,k 加1 endx_star=x1, iter=k %1x 为解的近似值,iter 为迭代次数 运行结果:x_star =0.07696 ;iter =3③在区间[]4,3内, clcx1=3.5; %初值1x k=0;while k<=100 %k 从0开始到100循环 x0=x1; %将初值1x 赋给0xf0=x0.^3-sin(x0)-12*x0+1; %计算()0x f f1=3*x0.^2-cos(x0)-12; %计算()0'x f x1=x0-f0/f1; %计算得到新的近似值1xif abs(x1-x0)< 1.0e-6 %01x x -与允许精度作比较 break ; %条件ε≤-01x x 成立,跳出循环 endk=k+1; %条件ε≤-01x x 不成立,k 加1 endx_star=x1, iter=k %1x 为解的近似值,iter 为迭代次数 运行结果:x_star =3.4101;iter =33、运行结果:4、结果分析:从这题的结果可以看出,牛顿迭代法的迭代速度比一般迭代法的速度要快,牛顿法的迭代次数比较少。
例如,求在[]3,4--的根时,一般迭代法迭代了14次(iter =14),而牛顿法只用了2次(iter =2)。
总而言之,一般迭代法是一种逐次逼近的方法,具有原理简单、编制程序方便等优点,但存在是否收敛和收敛速度的快慢等问题。
牛顿迭代法是一种特殊的迭代法,用于求方程的单根时具有2阶收敛。
因此是一种求非线性方程解的好方法,还可以用于求重根和复根,而且可以推广到求非线性方程组的解.二、解方程组直接法1、已知42158721048361261120A ⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦ 对矩阵A 做LU 分解。
2、用追赶法解下述方程组Ax b =,并给出n=10的结果,其中⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=2112112112 A ,⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡----=5557 b1、杜利特尔分解法(直接三角分解法):设方程组b Ax =的系数矩阵A 的各阶主子式()()n k A k ,,2,10det =≠,则可知该方程组存在唯一的杜利特尔分解:LU A =,其中⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=-11112121nn n n l l l l L ,⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=nn n n u u u u u u U 22211211. 我们记矩阵A 的第i 行第j 列元素为ij a ,则矩阵U 的第一行和L 的第一列可由公式(1.1)求出:⎪⎩⎪⎨⎧====.,,3,2,,,,2,1,111111n i ua l n j a u i i j j (2.1) 再由公式(2.2)求出U 的第k 行()n k ,,2 =、L 的第k 列()1,,2-=n k 元素:⎪⎪⎪⎩⎪⎪⎪⎨⎧++=-=+=-=∑∑-=-=.,,2,1,,,,1,,1111n k k i u u l a l n k k j u l a u kk k p pkip ik ik k p pj kp kj kj (2.2)(1)算法步骤:由于系数矩阵A 的各阶主子式()()n k A k ,,2,10det =≠,则可知该方程组存在唯一的杜利特尔分解:LU A =。
① 利用公式(2.1)和(2.2)求出U 和L 的元素ki u 和ik l 。
② 求解单位下三角形方程组b Ly =,即按公式⎪⎩⎪⎨⎧=-==∑-=1111,,3,2,,k j jkj k k n k y l b y b y (2.3)求出n y y y ,,,21 。
④ 求解上三角形方程组y Ux =,即按公式⎪⎪⎪⎩⎪⎪⎪⎨⎧--=-==∑+=1,,2,1,,1n n k u x u y x u y x kk nk j jkj k k nnn n (2.4) 可求得方程组的解:11,,,x x x n n -。
(2)程序代码:function [L,U]=LU(A)A[n,n]=size(A); %定义A 为n n ⨯阶矩阵 L=zeros(n,n); %矩阵L 初始化 U=zeros(n,n); %矩阵U 初始化 for i=1:nL(i,i)=1; %矩阵L 的对角线元素为1endfor k=1:n for j=k:nU(k,j)=A(k,j)-sum(L(k,1:k-1).*U(1:k-1,j)');%求出U 元素ki uendfor i=k+1:nL(i,k)=(A(i,k)-sum(L(i,1:k-1).*U(1:k-1,k)'))/U(k,k);%求出L 的元素ik lend endA=[4 2 1 5;8 7 2 10;4 8 3 6;12 6 11 20]; %矩阵A [L,U]=LU(A) %LU A =2、追赶法设所求方程组为⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧=+=++=++=++=+-------n n n n n n n n n n n n r x b x a r x c x b x a r x c x b x a r x c x b x a r x c x b 11111213433323232221212111 , (2.5)(1)算法步骤:① 由方程组的第1个方程,将未知元1x 用2x 表示为12111b x c r x -=记111b r u =,111b cv =,得 2111x v u x -=。