计算方法实验一
实验一常用计算方法及描述统计量分析
实验一常用计算方法及描述统计量分析1.引言描述统计量是统计学中常用的数据分析方法。
通过统计样本数据的各种特征指标,可以对总体数据的一些性质进行分析和描述。
本实验主要介绍几种常用的计算方法及描述统计量分析。
2.均值均值是描述数据集中趋势的一个重要统计量。
一组数据的均值可以通过将所有观察值相加,然后除以观察值的总数来计算。
均值可以用来描述一个数据集的集中趋势,通常用符号μ来表示。
3.中位数中位数是将一组有序数据划分为较小和较大两部分的值,位于中间位置的值。
对于一个有序的数据集,中位数就是位于中间位置的数值。
如果数据集的观察值个数是奇数,则中位数是排在中间的值;如果数据集的观察值个数是偶数,中位数是排在中间两个值的平均值。
4.众数众数是数据集中出现频率最高的数值。
一个数据集可以有一个或多个众数。
众数可以用来描述数据集中出现频率最高的数值,通常用符号Mo 表示。
5.极差极差是描述数据集分散程度的一个统计量。
它是数据集中最大值与最小值的差别。
极差可以用来描述数据集的波动性,如果极差较大,说明数据分散程度较大。
6.方差方差是描述数据集分散程度的一个统计量。
方差是数据与其均值之间差异的平均平方值。
方差可以用来描述数据集的波动性,如果方差较大,说明数据分散程度较大。
7.标准差标准差是描述数据集分散程度的一个统计量。
标准差是方差的平方根,用符号σ来表示。
标准差可以用来描述数据集的波动性,如果标准差较大,说明数据分散程度较大。
8.相关系数相关系数是描述两个变量之间关系强度的一个统计量。
相关系数的取值范围在-1到1之间,当相关系数为正时,表示两个变量正相关,当相关系数为负时,表示两个变量负相关。
相关系数可以用来描述两个变量之间的关联程度。
9.回归分析回归分析是一种描述和预测变量之间关系的方法。
回归分析可以用来研究因变量与自变量之间的关系,并通过建立回归方程对因变量进行预测和解释。
10.结论通过实验一的学习,我们了解了常用的计算方法及描述统计量分析。
计算方法 实验一 方程求根
实验一方程求根(1)二分法
1、实验程序
实现二分法的MATLAB函数文件agui_bisect.m
2. 在MATLAB命令窗口输入及实验结果及操作界面
(2)迭代法
1、实验程序
实现二分法的MATLAB函数文件agui_iterative.m
2、在MATLAB命令窗口输入及实验结果及操作界面
(3)牛顿法
1、实验程序
实现二分法的MATLAB函数文件agui_newton.m
2、在MATLAB命令窗口输入及实验结果及操作界面
结果分析:
由上面的对二分法、迭代法、牛顿法三种方法的三次实验结果,我们可以得出这样的结论:
二分法要循环k=10次,迭代法要迭代k=4次,牛顿法要迭代k=2次才能达到精度为0.5*10^-3的要求,而且方程0210=-+x e x
的精确解经计算,为0.0905250,由此可知,牛顿法和迭代法的精确度要优越于二分法。
而这三种方法中,牛顿法不仅计算量少,而且精确度高。
从而可知牛顿迭代法收敛速度明显加快,但由所学的内容可知,其收敛性与初值有关,它是局部收敛的。
二分法收敛虽然是速度最慢,但也常用于求精度不高的近似根。
而迭代法是逐次逼近的方法,原理简单,但存在收敛性和收敛速度的问题。
总之各种方法都各有优劣,适用于不同的情况中,须具体情况具体分析。
计算方法实验指导书
第一章 绪论一、主要要求通过实验,认真理解和体会数值计算的稳定性、精确性与步长的关系。
二、主要结果回顾:1、算法:电子计算机实质上只会做加、减、乘、除等算术运算和一些逻辑运算,由这些基本运算及运算顺序规定构成的解题步骤,称为算法.它可以用框图、算法语言、数学语言或自然语言来描述。
用计算机算法语言描述的算法称为计算机程序。
(如c —语言程序,c++语言程序,Matlab 语言程序等)。
2、最有效的算法:应该运算量少,应用范围广,需用存储单元少,逻辑结构简单,便于编写计算机程序,而且计算结果可靠。
3、算法的稳定性:一个算法如果输入数据有误差,而在计算过程中舍入误差不增长,则称此算法是数值稳定的,否则称此算法为不稳定的。
换句话说:若误差传播是可控制的,则称此算法是数值稳定的,否则称此算法为不稳定的。
4、控制误差传播的几个原则: 1)防止相近的两数相减; 2)防止大数吃小数;3)防止接近零的数做除数;4)要控制舍入误差的累积和传播;5)简化计算步骤,减小运算次数,避免误差积累。
三、数值计算实验(以下实验都需利用Matlab 软件来完成) 实验1.1(体会数值计算精度与步长关系的实验)实验目的:数值计算中误差是不可避免的,要求通过本实验初步认识数值分析中两个重要概念:截断误差和舍入误差,并认真体会误差对计算结果的影响。
问题提出:设一元函数f :R →R ,则f 在x 0的导数定义为:hx f h x f x f h )()(lim)('0000-+=→实验内容:根据不同的步长可设计两种算法,计算f 在x 0处的导数。
计算一阶导数的算法有两种:hx f h x f x f )()()('000-+≈(1)hh x f h x f x f 2)()()('000--+≈(2)请给出几个计算高阶导数的近似算法,并完成如下工作: 1、对同样的h ,比较(1)式和(2)式的计算结果;2、针对计算高阶导数的算法,比较h 取不同值时(1)式和(2)式的计算结果。
计算方法-插值方法实验
实验一插值方法一. 实验目的(1)熟悉数值插值方法的基本思想,解决某些实际插值问题,加深对数值插值方法的理解。
(2)熟悉Matlab 编程环境,利用Matlab 实现具体的插值算法,并进行可视化显示。
二. 实验要求用Matlab 软件实现Lagrange 插值、分段线性插值、三次Hermite 插值、Aitken 逐步插值算法,并用实例在计算机上计算和作图。
三. 实验内容1. 实验题目 (1)已知概率积分dxe y xx ⎰-=22π的数据表构造适合该数据表的一次、二次和三次Lagrange 插值公式,输出公式及其图形,并计算x =0.472时的积分值。
答:①一次插值公式:输入下面内容就可以得到一次插值结果 >> X=[0.47,0.48];Y=[0.4937452,0.5027498]; >> x=0.472;>> (x-X(2))/(X(1)-X(2))*Y(1)+(x-X(1))/(X(2)-X(1))*Y(2)ans =0.495546120000000>>②两次插值公式为:输入下面内容就可以得到两次插值结果>> X=[0.46,0.47,0.48];Y=[0.4846555,0.4937452,0.5027498]; >> x=0.472;>>(x-X(2))*(x-X(3))/((X(1)-X(2))*(X(1)-X(3)))*Y(1)+(x-X(1))*(x-X(3))/((X(2)-X(1))*(X(2)-X(3)))*Y(2)+(x-X(2))*(x-X(1))/((X(3)-X(2))*(X(3)-X(1)))*Y(3)i 0123x 0.46 047 0.48 0.49 y0.4846555 0.4937452 0.5027498 0.5116683ans =0.495552928000000>>③三次插值公式为:输入下面内容就可以得到三次插值结果>> X=[0.46,0.47,0.48,0.49];Y=[0.4846555,0.4937452,0.5027498,0.5116683];>> x=0.472;>>(x-X(2))*(x-X(3))*(x-X(4))/((X(1)-X(4))*(X(1)-X(2))*(X(1)-X(3)))*Y(1)+(x-X(4))*( x-X(1))*(x-X(3))/((X(2)-X(4))*(X(2)-X(1))*(X(2)-X(3)))*Y(2)+(x-X(4))*(x-X(2))*( x-X(1))/((X(3)-X(4))*(X(3)-X(2))*(X(3)-X(1)))*Y(3)+(x-X(3))*(x-X(2))*(x-X(1))/(( X(4)-X(1))*(X(4)-X(2))*(X(4)-X(3)))*Y(4)ans =0.495552960000000输入下面内容,绘出三点插值的图:>> X=[0.46,0.47,0.48,0.49];Y=[0.4846555,0.4937452,0.5027498,0.5116683];>> x=linspace(0.46,0.49);>>y=(x-X(2)).*(x-X(3)).*(x-X(4))/((X(1)-X(4))*(X(1)-X(2))*(X(1)-X(3)))*Y(1)+(x-X(4) ).*(x-X(1)).*(x-X(3))/((X(2)-X(4))*(X(2)-X(1))*(X(2)-X(3)))*Y(2)+(x-X(4)).*(x-X(2) ).*(x-X(1))/((X(3)-X(4))*(X(3)-X(2))*(X(3)-X(1)))*Y(3)+(x-X(3)).*(x-X(2)).*(x-X(1) )/((X(4)-X(1))*(X(4)-X(2))*(X(4)-X(3)))*Y(4);>>plot(x,y)(注意上面的“.*”不能用“*”替代);(2)将区间[-5,5]分为10等份,求作211)(x x f +=的分段线性插值函数,输出函数表达式及其图形,并计算x =3.3152时的函数值。
计算方法实验报告
班级:地信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
计算方法实验一-二分法
学院 长望学院 专业 大气科学实验班 年级 班次 1 姓名 仙女 学号1. 引言-问题重述问题一要求对方程3()250f x x x =--=,用二分法,至少找到一个根,并展示一下信息:(a )近似根(b )初始猜测(区间)(c )迭代次数(d )停止准则(3)收敛速度 问题二要求用二分法求出以下两个方程的近似根:(a )5()10f x x x =--=,(b )22520x e x -+=.2. 数学公式-数值方法和参数定义二分法求根原理为:若[,]f C a b ∈,严格单调,且()()0f a f b <g ,则f 在(,)a b 上有一实根。
其基本思想为:逐步将区间分半,计算中点处的函数值,根据介值定理选择比原区间缩小一半的有根区间,如此继续下去,直到得到满足精度要求,从而求出满足给定精度的根的近似值。
针对问题一,本文根据方程,定义函数f(x)=a*x*x*x+b*x*x+c*x+d=0,其中,,,a b c d 为各项系数;精度16eps e =-;,m n 分别为求根区间的左右端点,即收敛区间[,]m n ;i 为近似根;v 为收敛速度,count 为当前迭代次数。
其中,count 为单精度int 类型,其余均为双精度double 类型。
基于以上参数定义,设置收敛准则为:当根和函数值的精度小于所设置精度时,结束循环,并输出收敛区间、迭代次数、近似根以及收敛速度。
具体表现为:每进行一次循环视近似根i 的相对位置对收敛区间进行修正,同时对迭代次数+1;收敛速度可通过下式计算:11n n n n x x v x x +--=-. 针对问题二(a )在问题一的基础上,更改方程f(x)=a*x*x*x+b*x*x+c*x+d=0的系数以及相关项即可求得相应结果。
对于(b )将方程改为:exp(2*x)-5*x*x+20=。
3. 数值实验-讨论和分析数值结果针对方程3()250f x x x =--=,首先对其求导,判断单调性,再进行需略估算,发现(2)(3)0f f <g ,于是设置初始收敛区间为[2,3],进而通过二分法求得结果如图1。
数值计算方法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)(选作部分)请从理论上分析产生这一问题的根源。
计算方法非线性方程求根实验
f (a ) ⋅ f (b) < 0 ;又设 f ( x) 的一个零点 x* ∈ (a, b) 的近似值 (设f ′( x0 ) ≠ 0) 。用过曲
数值计算方法实验1
学院(系)名称:)()()()(0101112x x x f x f x f x x ---=附录(源程序及运行结果):一.二分法#include<stdio.h>#include<math.h>double f(double x){return x*x-x-1;}void main(){float a=0,b=0,x=1,m,e;int k;while(f(a)*f(b)>0){printf("请输入区间a,b的值。
以及精度e\n");scanf("%f,%f,%f",&a,&b,&e);}k=0;if(f(a)*f(b)==0){if(f(a)==0)printf("使用二分法输出:a=%f,k=%d\n",a,k);elseprintf("使用二分法输出:b=%f,k=%d\n",b,k);}else{while(f(a)*f(b)!=0){m=(a+b)/2;if(fabs(a-b)/2<e){printf("使用二分法输出:m=%f,k=%d\n",m,k);break;}else {if(f(a)*f(m)>0)a=m;else b=m;k=k+1;}}}}运行结果:二.迭代法与牛顿迭代法#include<stdio.h>#include<math.h>double f(double x){return exp(-x);}double f1(double x){return (x*exp(x)-1);}double ff(double x){return (exp(x)+x*exp(x));}void diedaifa(double x0,double e,int N){double x1;int k=1;while(k!=N){x1=f(x0);if(fabs(x1-x0)>=e){k++;if(k==N)printf("迭代失败!\n");x0=x1;}else{printf("使用迭代法输出结果:%lf\n",x1);break;}}}void NDdiedaifa(double x0,double e,int N){int k=1;double x1;while(k!=N){if(ff(x0)==0)printf("公式f(x)奇异!\n");else{x1=x0-f1(x0)/ff(x0);if(fabs(x1-x0)>=e){k++;if(k==N)printf("迭代失败!\n");x0=x1;}else{printf("使用牛顿迭代法输出结果:%lf\n",x1);break;}}}}void main(){double x0,e;int N;printf("请输入初值:");scanf("%lf",&x0);printf("精度:");scanf("%lf",&e);printf("以及判定迭代失败的最大次数N:");scanf("%d",&N);diedaifa(x0,e,N);NDdiedaifa(x0,e,N);}运行结果:四.双点弦截法#include<stdio.h>#include<math.h>double f(double x){return (x*x*x+3*x*x-x-9);}void main(){double x0,x1,x2,e;int N;int k=1;printf("请输入初值x0和x1:");scanf("%lf,%lf",&x0,&x1);printf("精度:");scanf("%lf",&e);printf("以及判定迭代失败的最大次数N:");scanf("%d",&N);while(k!=N){x2=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));if(fabs(f(x2))>=e){k++;if(k==N)printf("迭代失败!\n");x0=x1;x1=x2;}else{printf("使用双点弦截法输出结果:%lf\n",x2);break;}}}运行结果:。
计算方法实验报告(附代码)
实验一 牛顿下山法实验说明:求非线性方程组的解是科学计算常遇到的问题,有很多实际背景.各种算法层出不穷,其中迭代是主流算法。
只有建立有效的迭代格式,迭代数列才可以收敛于所求的根。
因此设计算法之前,对于一般迭代进行收敛性的判断是至关重要的。
牛顿法也叫切线法,是迭代算法中典型方法,只要初值选取适当,在单根附近,牛顿法收敛速度很快,初值对于牛顿迭代 至关重要。
当初值选取不当可以采用牛顿下山算法进行纠正。
牛顿下山公式:)()(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)
电子科技大学《数值计算方法》
实
验
报
告
输入6,1;0,1,21i i n a b i i n ===+=−" 结果得f=1.718263
输入10,1;0,1,21i i n a b i i n ===+=−" 结果得f=1.718282
输入100,1;0,1,21i i n a b i i n ===+=−" 结果得f=1.718282
从中计算结果看随n 增大迭代计算结果逐渐稳定,可认为出现此现象有两种情况一是对该输入序列a,b 用此迭代公式随序列増长会逐渐逼近一个稳定值,二是在迭代计算过程中产生大数“吃掉”小数现象且计算结果只取7为有效数字。
3. 实验结论
在计算机内做加法运算时,首先要对加数作对阶处理,加之计算机字长有限,因尽量避免出现大数吃小数现象,计算时要注意运算次序,否则会影响结果的可靠性。
报告评分:
指导教师签字:。
计算方法 实验报告 拉格朗日 龙贝格 龙格库塔
主界面:
/*lagrange.c*/
float real_value(float x) /*由被插值函数计算真实值*/
c=getchar();
if(c=='N'||c=='n') break;
}
}
/*romberg.c*/
double function(double x) /*被积函数*/
{
return 4.0/(1+(x)*(x));
}
double t(double a,double b,int m) /*计算T1*/
实验二(龙贝格公式)
§公式
§算法描述
§流程图
§运行结果
§结果分析:Romberg积分法是在积分步长逐步折半的过程中,用低精度求积公式的组合得到更高精度求积公式的一种方法,它算法简单,且收敛加速效果极其显著。
实验三(四阶龙格库塔)
§公式
k1=h*f(xn,yn);
k2=h*f(xn+h/2,yn+k1/2);
T1=t(a,b,0);
T2=T1/2.0+t(a,b,1);
S1=(4*T2-T1)/3.0;
T1=T2;
T2=T1/2.0+t(a,b,2);
S2=(4*T2-T1)/3.0;
C1=(16*S2-S1)/15.0;
T1=T2;
T2=T1/2.0+t(a,b,3);
S1=S2;
S2=(4*T2-T1)/3.0;
《计算方法》实验报告材料
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;
《计算方法实验》课件
计算方法实验 PPT 课件
实验介绍
实验安排
详细介绍了实验进行的时间安排和实验室要求。
实验目的
阐述了学习计算方法实验的重要目标和价值。
实验内容概述
概括性地介绍了实验涉及的主要内容和操作。
计算方法基础知识回顾
数值计算方法概述
概括了数值计算方法的定义和应用领域。
插值法简介
解释了插值法在数值计算中的作用和原理。
1 实验步骤
具体描述了进行插值法实验的步骤和操作流程。
2 实验要求
列举了完成实验所需的前置条件和要求。
3 实验结果和分析
总结了实验结果并给出了相关数据的分析和解释。
实验三:数值微积分实验
1 实验步骤
具体说明了进行数值微 积分实验的步骤和具体 操作。
2 实验要求
概述了完成实验所需的 前提条件和技术要求。
其他资料
介绍了一些其他有关计算方法实验的相关资料和参考。
3 实验结果和分析
总结了实验的结果,并 进行了相应数据分析和 解读。
实验总结
实验心得
分享了在完成实验过程中 的感悟和收获。
实验成果展示
展示了实验中获得的数据 和图表等成果知识和技能。
参考资料
书籍
推荐了一些计算方法方面的经典教材和参考书籍。
网络资源
提供了一些在线学习计算方法实验的优质网站和资源。
矩阵运算基础
介绍了矩阵的基本运算规则和重要性。
数值微积分概述
回顾了数值微积分的基本概念和计算方法。
实验一:矩阵运算实验
1 实验步骤
详细说明了进行矩阵运 算实验的步骤和操作。
2 实验要求
列出了完成实验所需的 前提条件和要求。
matlab计算方法实验报告1(方程求根)
计算方法实验报告(1)学生姓名杨贤邦学号指导教师吴明芬实验时间2014.3.26地点综合实验楼大楼203实验题目非线性方程求根实验目的●掌握Matlab编程方法;●掌握非线性方程的数值求根方法及Matlab或C实现;实验内容●Matlab常用命令;●二分求根法及其Matlab实现●Newton求根法或割线法及其Matlab实现●题目由同学从学习材料中任意选两题算法分析与二分法:function x=method2(fname,a,b,e)fa=feval(fname,a);fb=feval(fname,b);if fa*fb>0error('两个函数值同号');endk=0x=(a+b)/2while(b-a)>eif k>3000error('已运行3000次,请检查是否为死循环(e太小或e为负数)');end fx=feval(fname,(b+a)/2);if fx*fa>0a=(b+a)/2;fa=fx;elseb=(b+a)/2;endk=k+1x=(b+a)/2end割线法:function x=gexianfa(fname,x0,x1,e)k=0;x=x1;while abs(x-x0)>eif k>3000error('已迭代3000次,请检查是否收敛或e太小');end源程序fx0=feval(fname,x0);fx1=feval(fname,x1);cache=x1;k=k+1x=x1-fx1/(fx1-fx0)*(x1-x0)x0=x1;x1=x;end实验结果与分析分别用二分法和割线法计算x3-15x2+42x+8=0在区间[3,5]的一个根,且误差不超过10-8割线法:k=1x=3.89655172413793k=2x=3.99315350368514k=3x=4.00007427733589k=4x=3.99999994899663k=5x=3.99999999999962k=6x=4.00000000000000ans=4.00000000000000二分法:k=1x=3.50000000000000k=2x=3.75000000000000k=3x=3.87500000000000k=4x=3.93750000000000k=5x=3.96875000000000k=6x=3.98437500000000k=7x=3.99218750000000k=8x=3.99609375000000k=9x=3.99804687500000k=10x=3.99902343750000k=11x=3.99951171875000k=12x=3.99975585937500k=13x=3.99987792968750k=14x=3.99993896484375k=15x=3.99996948242188k=16x=3.99998474121094k=17x=3.99999237060547k=18x=3.99999618530273k=19x=3.99999809265137k=20x=3.99999904632568k=21x=3.99999952316284k=22x=3.99999976158142k=23x=3.99999988079071k=24x=3.99999994039536k=25x=3.99999997019768k=26x=3.99999998509884k=27x=3.99999999254942k=28x=3.99999999627471ans=3.99999999627471从上面的计算结果很直观的体现了二分法的的效率真的很低,割线法只需要迭代6次就可以得出结果,而二分法却需要运行28次其它Matlab遇到死循环就出现程序假死的情况,想关都关不掉,真的很烦。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算方法》实验报告
,n x 处的插值基函数,()n l x ,其中,插值节点011011()()()()
()()()()
i i n i i i i i i n x x x x x x x x x x x x x x x x ;
作为()i l x 的系数,使得()i i y l x 通过插值点(,)i i x y ; :把所有的()i i y l x 线性叠加,得到通过所有插值点(,),0,1,,i i x y i
n 的插值函数
()n
i i i y l x 。
Lagrange 插值伪代码: 个插值点00(,),(,(,)n n x y x y 在点t 处的函数值。
输入参数
0,x 1,….,x n ), 插值节点1,…,y n ); 被插函数 求插值函数 插值函数
for (int i = 0; i<n; i++) {
res = res + Lbase[i] * Y[i];
}
return res;
}
实验结果:
分段线性差值:
子程序:
float fenduan(float X[], float Y[], int n, float x)
{
int h = 1;
int xl = x;
float yi = 1.0 / (1.0+ xl*xl);
float yiplus =1.0/(1.0+ (xl + 1)*(xl + 1));
float res;
res = yi*(1 - ((x - xl) / h)) + yiplus*((x - xl) / h);
return res;
}
主程序:
int main()
{
float X[N], Y[N], x;
int num;
ifstream in("input.txt");
in >> num;
for (int i = 0; i < num; i++)
{
in >> X[i];
in >> Y[i];
}
in >> x;
float jingque = 1 / (1 + x*x);
float result = fenduan(X, Y, num, x);
cout <<"我们求"<< x <<"的近似值"<< endl;
cout <<"分段线性结果为:"<< result << endl;
cout <<"精确值为:"<< jingque << endl;
cout <<"误差为:"<< abs(jingque - result) << endl;
return 0;
}
结果:
牛顿:
子程序:
//求插上
float chashang(float X[], float Y[], int n)
{
float res = 0;
float temp = 0;
for (int i = 0; i<n + 1; i++) {
temp = Y[i];
for (int j = 0; j<n + 1; j++)
{
if (i != j) {
temp = temp / (X[i] - X[j]);//就是把他们的积球出来}
}
res = res + temp;//求和
}
return res;
}
float niudun(float X[], float Y[], float x, int n)
{
double res = 0;
for (int i = 0; i<n; i++)
{。
如图一所示。
0.10.20.30.40.50.60.70.80.91
0.4
0.5
0.6
0.7
0.8
0.9
1
离散点
Lagrange 插值Newton 插值
图1
2
-1
-0.8-0.6-0.4-0.200.20.40.60.81
-1-0.5
0.5
1
1.5
2
Lagr.3Lagr.5
Lagr.7
Lagr.9
Lagr.11
Lagrange
Largr 插值f(x)图像。