数值分析常微分数值解的求法C语言

合集下载

微分方程数值解法C语言-课程设计

微分方程数值解法C语言-课程设计

微分方程数值解法C语言-课程设计微分方程数值解法C语言由于对matlab语言不熟悉,所以还是采用C。

前面几个都比较简单,最后一个需要解非其次方程组。

采用高斯—Jordan消元法(数值分析)求逆解方程组,也再一次体会到算法本身的重要性,而不是语言。

当然,矩阵求逆的算法也在100个经典的C语言算法之列。

不过偏微分方程数值解的内容的确比较高深,我只能停留在编这种低级的东西的自娱自乐中。

不过解决计算机、数学、信计专业的课程设计还是足够了。

由于篇幅所限,只把源代码粘贴在这。

一:预报矫正格式#include <math.h>#include<iostream>#include<stdlib.h>double count_0( double xn,double yn){//矫正格式double s;s=yn+0.1*(yn/xn*0.5+xn*xn/yn*0.5);return s;}double count_1(double xn,double yn,double y0){//预报格式double s;s=yn+0.05*((yn/xn*0.5+xn*xn/yn*0.5)+(y0/xn*0.5+xn*xn/y0*0.5));return s;}void main(){//计算,步长为0.1,进行10次计算,设初始值double xn=1,yn=1;int i=1;while(i<=10){printf("%16f ,%1.16f ,%1.16f\n",xn,yn,count_1(xn,yn,count_0(xn,yn)));xn=xn+0.1;yn=count_1(xn,yn,count_0(xn,yn));i++;}}二显示差分格式#include<iostream>#include<math.h>#include<stdlib.h>main(){double a[6][11];//初始化;for(int i=0;i<=5;i++){a[0]=0;a[10]=0;}for(int j=1;j<10;j++){double p=3.14*j*0.1;a[0][j]=sin(p);}//按显示格式计算for(i=1;i<=5;i++)for(j=1;j<10;j++)a[j]=a[i-1][j-1]+a[i-1][j+1]; //输出计算好的矩阵for(i=0;i<=5;i++){for(j=0;j<11;j++)printf("%1.10f ",a[j]);printf("\n");}}三龙阁库塔格式#include <math.h>#include<iostream>#include<stdlib.h>double count_k( double xn,double yn){ double s;s=yn/xn*0.5+xn*xn/yn*0.5;return s;}void main(){//步长为0.1double xn=1,yn=1;int i=1;while(i<=11){printf("%f ,%f\n",xn,yn);double k1=count_k(xn,yn);double k2=count_k(xn+0.05,yn+0.05*k1); double k3=count_k(xn+0.05,yn+0.05*k2); double k4=count_k(xn+0.01,yn+0.1*k3); yn=yn+0.1/6*(k1+2*k2+2*k3+k4);xn=xn+0.1;i++;}}四 CRANK--NICOLSON隐式格式#include<iostream>#include<math.h>#include<stdlib.h>double Surplus(double A[],int m,int n);double * MatrixInver(double A[],int m,int n);double * MatrixOpp(double A[],int m,int n) /*矩阵求逆*/ {int i,j,x,y,k;double *SP=NULL,*AB=NULL,*B=NULL,X,*C;SP=(double *)malloc(m*n*sizeof(double));AB=(double *)malloc(m*n*sizeof(double));B=(double *)malloc(m*n*sizeof(double));X=Surplus(A,m,n);X=1/X;for(i=0;i<m;i++)for(j=0;j<n;j++){for(k=0;k<m*n;k++)B[k]=A[k];{for(x=0;x<n;x++)B[i*n+x]=0;for(y=0;y<m;y++)B[m*y+j]=0;B[i*n+j]=1;SP[i*n+j]=Surplus(B,m,n);AB[i*n+j]=X*SP[i*n+j];}}C=MatrixInver(AB,m,n);return C;}double * MatrixInver(double A[],int m,int n) /*矩阵转置*/ {int i,j;double *B=NULL;B=(double *)malloc(m*n*sizeof(double));for(i=0;i<n;i++)for(j=0;j<m;j++)B[i*m+j]=A[j*n+i];return B;}double Surplus(double A[],int m,int n) /*求矩阵行列式*/ {int i,j,k,p,r;double X,temp=1,temp1=1,s=0,s1=0;if(n==2){for(i=0;i<m;i++)for(j=0;j<n;j++)if((i+j)%2) temp1*=A[i*n+j]; else temp*=A[i*n+j];X=temp-temp1;}else{for(k=0;k<n;k++){for(i=0,j=k;i<m,j<n;i++,j++) temp*=A[i*n+j];if(m-i){for(p=m-i,r=m-1;p>0;p--,r--) temp*=A[r*n+p-1];}s+=temp;temp=1;}for(k=n-1;k>=0;k--){for(i=0,j=k;i<m,j>=0;i++,j--) temp1*=A[i*n+j];if(m-i){for(p=m-1,r=i;r<m;p--,r++) temp1*=A[r*n+p];}s1+=temp1;temp1=1;}X=s-s1;}return X;}void initmat_A(double a[][9],double r){ for(int i=0;i<9;i++)for(int j=0;j<9;j++)a[j]=0;for(i=0;i<9;i++){a=1+r;if(i!=8) a[i+1]=-0.5*r;if(i!=0) a[i-1]=-0.5*r;}}void initmat_B(double b[][9],double r){ for(int i=0;i<9;i++)for(int j=0;j<9;j++)b[j]=0;for( i=0;i<9;i++){b=1-r;if(i!=8) b[i+1]=0.5*r;if(i!=0) b[i-1]=0.5*r;}}void initmat_C(double C[][9]){ for(int i=0;i<9;i++)for(int j=0;j<9;j++)C[j]=0;}void main(){double a[100][11];for(int i=0;i<100;i++)for(int j=0;j<11;j++)a[j]=0;//初始化;for(i=0;i<100;i++){a[0]=0;a[10]=0;}for(int j=1;j<10;j++){double p=4*3.14*j*0.1;a[0][j]=sin(p);}//取h=0.1*3.14,r=0.0005,t=0.0001*3.14*3.14; //得到矩阵a和矩阵bdouble A[9][9];initmat_A(A,0.005);double B[9][9];initmat_B(B,0.005);//B矩阵与Un相乘,en是0;double C[9][9];initmat_C(C);double *A_;A_=MatrixOpp(A[0],9,9);//A矩阵求逆;//A逆*Bfor(i=0;i<9;i++)for(j=0;j<9;j++)for(int s=0;s<9;s++)C[j]+=A_[i*9+s]*B[s][j];//填写a表格for(i=0;i<100;i++){for(j=1;j<10;j++)for(int s=0;s<9;s++)a[i+1][j]+=a[s+1]*C[j-1][s];}//输出表格for(i=0;i<100;i++){for(j=0;j<11;j++)printf("%1.8f ",a[j]);printf("\n");}printf("\n"); printf("\n");//利用精确解,求出表格for(i=0;i<100;i++){for(j=0;j<11;j++)printf("%1.8f",exp(-16*0.0001*0.0005*3.14*3.14*i)*sin(4*j*0.1*3.14));printf("\n");}}。

一阶常微分方程数值解的C语言编程实现

一阶常微分方程数值解的C语言编程实现

一阶常微分方程数值解的C语言编程实现现实问题与分析学科自身的发展,使得微积分及其涉及领域内出现了寻求数值解的诸多问题(在其他数学领域亦是如此)。

这是由于多种原因造成的,比如现实问题中函数表达式往往并不存在,即使可以拟合也并没有得到表达式的必要且表达式的讨论可能出现较大误差。

再比如,很多复杂函数或函数约束条件很难使用甚至不能使用一般的分析工具,像微分方程存在不可积、不可解的大量实例。

所以数值解的相关理论不断产生、完善。

特别是现代以来,计算机的迅速发展为解决数值解问题提供了算法的计算机程序实现可能,并提供了更多的求解思路。

Mathematica,MATLAB,Maple是最常用的数学软件,对应于Mathematica语言,MATLAB语言,Maple语言。

当然,一般使用C语言也可以比较便捷地解决很多分析学科问题的数值解。

举一元函数微积分学一些熟知的数值解例子:数值导数常见有图解微分法、差商公式、插值多项式、拉格朗日公式(拉格朗日插值公式得来)、马尔科夫公式(牛顿插值公式得来)、等距公式、三次样条函数等等,数值积分有内插求积公式(最为基础的有梯形法、辛普森公式(抛物线法))、高斯型求积公式等等。

这里,考察一阶导数已解出的一阶常微分方程的初值问题的数值解。

问题给出:常微分方程数值解问题中,一阶常微分方程与一阶常微分方程组(一阶导数均解出形式)的数值解法是最基础的,也是非常常用的。

一般数值解法有欧拉方法及改进的欧拉方法、龙格-库塔方法、阿达姆斯方法。

现给出前两种方法,它们都是单步法,而阿达姆斯法是线性多步法,各有优缺点(此外计算机上常会加以使用浮动步长法,如自动变步长计算方法)。

单步法的通用表达式是拉格朗日中值定理的形式(差分代替微分是一种重要的近似思想,反过来用微分代替差分亦重要):欧拉方法:改进的欧拉方法(预报校正法):龙格-库塔方法:二阶龙格-库塔方法:四阶龙格-库塔方法:容易看出,欧拉方法及改进的欧拉方法都是特殊的龙格-库塔方法。

数值分析常微分方程数值解

数值分析常微分方程数值解

许多实际问题的数学模型是微分方程或微分方程的定解问题。

如物体运动、电路振荡、化学反映及生物群体的变化等。

常微分方程可分为线性、非线性、高阶方程与方程组等类;线性方程包含于非线性类中,高阶方程可化为一阶方程组。

若方程组中的所有未知量视作一个向量,则方程组可写成向量形式的单个方程。

因此研究一阶微分方程的初值问题⎪⎩⎪⎨⎧=≤≤=0)(),(y a y bx a y x f dxdy, (9-1) 的数值解法具有典型性。

常微分方程的解能用初等函数、特殊函数或它们的级数与积分表达的很少。

用解析方法只能求出线性常系数等特殊类型的方程的解。

对非线性方程来说,解析方法一般是无能为力的,即使某些解具有解析表达式,这个表达式也可能非常复杂而不便计算。

因此研究微分方程的数值解法是非常必要的。

只有保证问题(9-1)的解存在唯一的前提下,研究其数值解法或者说寻求其数值解才有意义。

由常微分方程的理论知,如果(9-1)中的),(y x f 满足条件(1)),(y x f 在区域} ),({+∞<<∞-≤≤=y b x a y x D ,上连续; (2)),(y x f 在上关于满足Lipschitz 条件,即存在常数,使得y y L y x f y x f -≤-),(),(则初值问题(9-1)在区间],[b a 上存在惟一的连续解)(x y y =。

在下面的讨论中,我们总假定方程满足以上两个条件。

所谓数值解法,就是求问题(9-1)的解)(x y y =在若干点b x x x x a N =<<<<= 210处的近似值),,2,1(N n y n =的方法。

),,2,1(N n y n =称为问题(9-1)的数值解,n n x x h -=+1称为由到1+n x 的步长。

今后如无特别说明,我们总假定步长为常量。

建立数值解法,首先要将微分方程离散化,一般采用以下几种方法: (1) 用差商近似导数在问题(9-1)中,若用向前差商hx y x y n n )()(1-+代替)(n x y ',则得)1,,1,0( ))(,()()(1-=≈-+N n x y x f hx y x y n n n n n)(n x y 用其近似值代替,所得结果作为)(1+n x y 的近似值,记为1+n y ,则有 1(,) (0,1,,1)n n n n y y hf x y n N +=+=-这样,问题(9-1)的近似解可通过求解下述问题100(,) (0,1,,1)()n n n n y y hf x y n N y y x +=+=-⎧⎨=⎩(9-2)得到,按式(9-2)由初值经过步迭代,可逐次算出N y y y ,,21。

使用C语言解常微分方程CODE

使用C语言解常微分方程CODE

使用C语言解常微分方程CODE在C语言中,我们可以使用数值方法来解常微分方程(ODEs)。

常见的数值方法有欧拉法、改进的欧拉法和四阶龙格-库塔法等。

首先,我们需要了解什么是常微分方程。

常微分方程是描述未知函数与其导数之间关系的方程。

一阶常微分方程可以写成如下形式:dy / dx = f(x, y)其中,y是未知函数,f(x,y)表示函数y和自变量x之间的关系。

我们可以通过离散化自变量x的值,来近似求解上述的常微分方程。

假设我们将自变量区间[a,b]划分成N个子区间,每个子区间的长度为h=(b-a)/N,那么我们可以将x离散化为{x0,x1,...,xN},其中x0=a,xN=b。

对于欧拉法来说,它是最简单的数值方法。

它的基本思想是通过线性逼近来求解常微分方程。

根据导数的定义,可以得到一个线性逼近的公式:dy / dx ≈ (y(i+1) - y(i)) / h将上述式子代入微分方程可以得到:y(i+1)=y(i)+h*f(x(i),y(i))其中x(i+1)=x(i)+h。

下面是一个用C语言实现欧拉法求解一阶常微分方程的例子:```c#include <stdio.h>double f(double x, double y)return x + y;void eulerMethod(double a, double b, int N) double h = (b - a) / N;double x = a;double y = 0; // initial conditionfor (int i = 0; i < N; i++)y=y+h*f(x,y);x=x+h;printf("x = %f, y = %f\n", x, y);}int maidouble a = 0; // initial value of xdouble b = 1; // final value of xint N = 10; // number of intervals eulerMethod(a, b, N);return 0;```在上面的例子中,我们定义了一个常微分方程f(x,y)=x+y。

数值计算中的常微分方程求解和数值积分

数值计算中的常微分方程求解和数值积分

数值计算中的常微分方程求解和数值积分数值计算是一门非常重要的学科,它在自然科学和工程技术领域中有着广泛的应用。

在数值计算中,常微分方程求解和数值积分是两个基础性的问题,它们的解法对于数值计算的其他问题具有重要的指导意义。

本文将就这两个问题进行探讨。

一、常微分方程求解常微分方程是描述自然界中许多过程的重要工具,它们由一个或多个未知函数及其一定数量的导数组成。

例如,牛顿第二定律和斯托克斯方程等经典物理学方程中均包含了一阶常微分方程。

近年来,生物过程的数学建模也成为常微分方程的热点研究领域,例如病毒扩散、癌症生长和人口增长等都可以用常微分方程来描述。

在解常微分方程的过程中,我们通常会使用数值方法。

常用的数值方法包括欧拉法、改进欧拉法、龙格-库塔法等。

以欧拉法为例,令 $y\left( t_0 \right) = y_0$,则在 $t_0$ 到 $t_1$ 的时间段内,有:$y_{n+1} = y_n + hf\left( t_n,y_n \right)$,其中 $y_{n+1}$ 表示 $t=T_{n+1}$ 时的函数值,$f\left( t_n,y_n \right)$ 表示 $t_n$ 时刻的导数值,$h$ 表示步长。

欧拉法是一种一阶方法,即误差的大小与步长成线性关系,因此需要选择足够小的步长以确保精度。

对于高阶常微分方程,我们通常需要将其转化为等价的一阶方程组进行求解。

例如,二阶常微分方程 $y'' + q\left( t \right)y' +p\left( t \right)y = g\left( t \right)$ 可以转化为以下一阶方程组:$z_1^\prime = z_2$$z_2^\prime = -q\left( t \right)z_2 - p\left( t \right)z_1 + g\left( t\right)$其中 $y = z_1$,$y' = z_2$。

使用C语言解常微分方程 C ODE

使用C语言解常微分方程 C ODE
一般的边值问题,我们是使用打靶法来求解, 对于这样一个方程
x '' f (t, x, x '), a t b
边界为,x(a) , x(b) .
主要思路是,化成初值问题来求解。 我们已有
Projet professionnel
Vincent. Wang
[3]
Équipe de Neutrons Dosimétrie
fk
(tm
h 2
,
y1m
h 2
f1,2 , y2m
h 2
f2,2 ,...., ynm
h 2
fn,2 )
fk,2 fk (tm h, y1m hf1,3, y2m hf2,3,...., ynm hfn,3 )
使用这个向量形式的龙格-库塔方法我们便可就出方程的数值解。
边值问题
对于边值问题,我们分为两类 一般的边值问题 线性边值微分方程
SYSU-IFCEN 2013-2014
实验报告
Projet professionnel
解常微分方程
姓名:Vincent
年级:2010,学号:1033****,组号:5(小组),4(大组) 1. 数值方法: 我们的实验目标是解常微分方程,其中包括几类问题。一阶常微分初值问题,高阶 常微分初值问题,常微分方程组初值问题,二阶常微分方程边值问题,二阶线性常 微分方程边值问题。 对待上面的几类问题,我们分别使用不同的方法。
k3
f
(tn
h 2 , yn
h 2 k2 ),
k4 f (tn h, yn hk3 ).
对于高阶微分方程及微分方程组 我们用
4 阶龙格-库塔方法来解
对于一个如下的微分方程组

数值分析常微分数值解的求法C语言

数值分析常微分数值解的求法C语言

本科生课程设计报告实习课程数值分析学院名称管理科学学院专业名称信息与计算科学学生姓名学生学号指导教师实验地点实验成绩二〇一六年六月二〇一六年六摘要常微分方程数值解法是计算数学的一个分支.是解常微分方程各类定解问题的数值方法.现有的解析方法只能用于求解一些特殊类型的定解问题,实用上许多很有价值的常微分方程的解不能用初等函数来表示,常常需要求其数值解.所谓数值解,是指在求解区间内一系列离散点处给出真解的近似值.这就促成了数值方法的产生与发展.?关键词:数值解法;常微分1. 实验内容和要求常微分方程初值问题 有精确解2()cos(2)x y x x e x -=+。

要求:分别取步长h = 0.1,0.01,0.001,采用改进的Euler 方法、4阶经典龙格-库塔R -K 方法和4阶Adams 预测-校正方法计算初值问题。

以表格形式列出10个等距节点上的计算值和精确值,并比较他们的计算精确度。

其中多步法需要的初值由经典R-K 法提供。

运算时,取足以表示计算精度的有效位。

2. 算法说明2.1函数及变量说明表1 函数及变量定义1、欧拉方法:1()()(,())i i i i y x y x hf x y x +=+ (i=0,1,2,3,......n-1)(0)y a= (其中a 为初值)2、改进欧拉方法:~1~111()()(,())()()[(,())(,())]2(0)i i i i i i i i i i y x y x hf x y x hy x y x f x y x f x y x y a ++++=+=++=(i=0,1,2......n-1) (其中a 为初值)3、经典K-R 方法: 11213243()6(,)(,)22(,)22(,)i i i i i i i i i i h y y K f x y h hK f x y K h h K f x y K K f x h y hK +⎧=+⎪⎪=⎪⎪⎪=++⎨⎪⎪=++⎪⎪=++⎪⎩4、4阶adams 预测-校正方法 预测: 校正:Adsms 内插外插公式联合使用称为Adams 预测-校正系统,利用外插公式计算预测,用内插公式进行校正。

一阶常微分方程数值解的C语言编程实现

一阶常微分方程数值解的C语言编程实现

一阶常微分方程数值解的C语言编程实现要编写一阶常微分方程的数值解的C语言程序,首先要理解常微分方程的概念和数值解的基本原理。

为了编写C程序实现一阶常微分方程的数值解,我们可以采用欧拉方法(Euler Method)。

该方法的迭代公式为:y(i+1) = y(i) + h *f(x(i), y(i)),其中i表示当前步数,h是步长。

下面是实现一阶常微分方程数值解的C语言程序的详细步骤:1. 确定常微分方程的形式,例如:dy/dx = x + y,可以通过修改f 函数来改变所求的常微分方程。

2. 导入需要的头文件,即stdio.h。

3. 编写函数f,根据常微分方程的形式计算dy/dx的值。

该函数接受两个参数x和y,返回dy/dx的值。

例如,对于上述例子,f函数可以写为:float f(float x, float y) { return x + y; }4. 编写主函数main,首先声明需要使用的变量,包括x的区间起止点xa和xb,步长h,以及迭代次数n。

另外,还需要声明变量x和y作为迭代过程中的中间变量。

5. 通过用户输入获取xa、xb、h和n的值,例如:printf("Enter the initial value of x (xa): "); scanf("%f", &xa);6. 计算x的区间个数:num = (xb - xa) / h。

7. 设置初始值:x = xa,y = 初始y值,例如:y = 0.0。

8. 使用for循环进行迭代,迭代次数为n。

在每次迭代中,计算dy/dx的值:k = f(x, y),并更新x和y的值:x = x + h,y = y + h * k。

9. 输出最终的数值解,例如:printf("The numerical solution of the differential equation is: %f\n", y)。

数值分析算法C语言程序

数值分析算法C语言程序

数值分析算法C语言程序数值分析是研究数学问题的近似解法的一门学科,其中包括了各种数值方法和算法。

本文将介绍数值分析中的常见算法,并给出相应的C语言程序。

1.二分法(Bisection Method)二分法是一种求函数零点的简单且常用的方法。

该方法的基本思想是通过不断将区间进行二分,并比较中点处函数值的正负来找到零点所在的区间。

```c#include <stdio.h>double f(double x)return x * x - 2;double bisection(double a, double b, double eps)double c;while ((b - a) > eps)c=(a+b)/2;if (f(c) == 0)break;}else if (f(a) * f(c) < 0)b=c;}elsea=c;}}return c;int maidouble a = 0.0;double b = 2.0;double result = bisection(a, b, eps);printf("The root is: %lf\n", result);return 0;```2.牛顿迭代法(Newton's Method)牛顿迭代法是一种高效的求函数零点的方法。

该方法的基本思想是通过对函数进行线性逼近,不断逼近函数的零点。

```c#include <stdio.h>#include <math.h>double f(double x)return x * x - 2;double df(double x)return 2 * x;double newton(double x0, double eps) double x = x0;double deltaX = f(x) / df(x);while (fabs(deltaX) > eps)deltaX = f(x) / df(x);x = x - deltaX;}return x;int maidouble x0 = 2.0;double result = newton(x0, eps); printf("The root is: %lf\n", result); return 0;```3.高斯消元法(Gaussian Elimination)高斯消元法是一种用于求解线性方程组的方法。

数值分析中的常微分方程数值求解

数值分析中的常微分方程数值求解

数值分析中的常微分方程数值求解常微分方程是自然科学中一类最为普遍的数学模型,涉及到热力学、物理、化工等多个领域。

然而,解常微分方程并非易事。

尤其是当我们面对一些复杂、非线性、多维的方程组时,常微分方程数值求解成为了一个十分关键的问题。

因此,数值求解方法成为了常微分方程研究中的重要组成部分。

本文将介绍一些数值解常微分方程的常见方法和应用。

1. 一般线性方法一般线性方法(general linear methods)是经典的常微分方程数值解法之一。

它以一种特殊的形式给出步进公式:$$ y_{n+1}=\sum_{i=0}^{s-1}\alpha_i y_{n-i}+h\sum_{i=0}^{s-1}\beta_i f(t_{n-i},y_{n-i}) $$ 其中,$y_{n}$为第$n$步的项值,$f(t_n,y_n)$为时间$t_n$处函数$y(t)$的导数。

$\alpha_i$和$\beta_i$是常数,可以通过确定如下特征方程来选择:$$ \sum_{i=0}^{s-1}\alpha_i\ lambda^{i}=0,~(\lambda\in C) $$ 与此同时,也可以通过选择$\beta_i$来使方法达到一定的准确性和稳定性。

2. Runge-Kutta方法比一般线性方法更为流行的方法是Runge-Kutta方法。

通常附加一个或多个修正以获得更好的数值稳定性和误差控制。

第1阶Runge-Kutta方法仅使用导数$f(t_n,y_n)$估算下一个项的值:$$y_{n+1}=y_n+hf(t_n,y_n)$$ 许多高阶方法可以使用中间的“插值”来更准确地估计下一个步骤:$$y_{n+1}=y_n+h\sum_{i=1}^kb_ik_i$$$$k_i=f(t_n+c_ih,y_n+h\sum _{j=1}^{i-1}a_{ij}k_j)$$ $k_i$是第$i$台车的估计值,$a_{ij}$和$b_i$在经典Runge-Kutta方法和其他变体中具有不同的取值。

数值分析第九章常微分方程数值解法

数值分析第九章常微分方程数值解法

数值分析第九章常微分方程数值解法常微分方程数值解法是数值分析中非常重要的一部分内容。

常微分方程是描述自然现象中动态变化规律的数学模型,解常微分方程可以揭示系统的变化趋势和规律。

然而,大多数常微分方程是无法通过解析方法求出解的,因此需要借助计算机进行数值计算。

数值解常微分方程方法主要包括:Euler方法、改进的Euler方法、四阶Runge-Kutta方法和龙格-库塔方法。

Euler方法是最简单的方法之一,它采用的是一阶Taylor展开式。

将待求的函数值与函数的一阶导数值代入Taylor展开式中,可以得到函数值在下一个时间步长上的近似值。

Euler方法的优点是简单易于实现,但其精度不够高,容易积累误差。

改进的Euler方法是对Euler方法的改进,它通过使用中间点上的导数值来减小误差。

改进的Euler方法的精度相比Euler方法要高一些,但仍然不够高。

四阶Runge-Kutta方法是目前使用较为广泛的数值解常微分方程的方法之一、它通过计算不同时间点上的斜率来估计函数值,在多个时间点上计算斜率的平均值来提高精度。

四阶Runge-Kutta方法的精度比Euler方法和改进的Euler方法要高,但计算量也相对较大。

龙格-库塔方法是数值解常微分方程中最常用的方法之一、它是四阶Runge-Kutta方法的延伸,通过计算不同时间点上的斜率来估计函数值,然后利用这些估计值计算更准确的斜率,在不同步长上进行迭代计算,直到满足所需精度。

龙格-库塔方法的精度比四阶Runge-Kutta方法要高,但计算量也相对较大。

除了以上几种方法外,还有一些其他数值解常微分方程的方法,如Adams法、Gear法等。

这些方法在不同场景下有着不同的适用性和优劣势。

总结起来,数值解常微分方程方法是研究常微分方程数值计算中的重要内容。

不同的方法有着不同的精度和计算量,可以根据具体问题的特点选择合适的方法进行数值计算。

然而,需要注意的是,数值解只是在给定的步长下对函数的近似值,可能会引入误差。

数值解常微分方程的方法和技巧

数值解常微分方程的方法和技巧

数值解常微分方程的方法和技巧在科学和工程领域,我们经常遇到一些复杂的常微分方程(Ordinary Differential Equations, ODEs),这些方程往往很难用解析方法得到精确解。

而数值解常微分方程的方法和技巧提供了一种有效的途径来近似求解这些方程。

本文将介绍一些常用的数值解ODEs的方法和技巧。

一、欧拉方法(Euler Method)欧拉方法是最简单的数值解ODEs的方法,它利用初始条件和微分方程的导数来计算下一个点的近似值。

具体来说,假设我们要求解的ODE为dy/dx = f(x, y),其中f(x, y)是已知函数,初始条件为x0 = x(0),y0 = y(0)。

欧拉方法的迭代公式为:y[i+1] = y[i] + h * f(x[i], y[i])其中,h是步长,x[i]表示第i个点的x坐标,y[i]表示对应的y坐标。

二、龙格-库塔方法(Runge-Kutta Method)龙格-库塔方法是一族常用的数值解ODEs方法,其基本思想是通过计算不同阶数的导数来提高求解的精度。

最常用的龙格-库塔方法是四阶龙格-库塔方法,也称为RK4方法。

它的迭代公式如下:k1 = h * f(x[i], y[i])k2 = h * f(x[i] + h/2, y[i] + k1/2)k3 = h * f(x[i] + h/2, y[i] + k2/2)k4 = h * f(x[i] + h, y[i] + k3)y[i+1] = y[i] + 1/6 * (k1 + 2*k2 + 2*k3 + k4)其中,k1、k2、k3、k4是中间变量,h是步长。

三、改进的欧拉方法(Improved Euler Method)改进的欧拉方法是对欧拉方法的改进,它通过使用导数的平均值来提高求解的精度。

其迭代公式为:k1 = h * f(x[i], y[i])k2 = h * f(x[i] + h, y[i] + k1)y[i+1] = y[i] + 1/2 * (k1 + k2)其中,k1、k2是中间变量,h是步长。

数值分析中的各种公式C 代码

数值分析中的各种公式C  代码

二分法2.2 算法步骤步骤1:准备计算f(x)在有根区间[a,b]端点处的值f(a),f(b).步骤2:二分计算f(x)在区间中点(a+b)/2处的值f((a+b)/2).步骤3:判断若f((a+b)/2)=0,则(a+b)/2即是根,计算过程结束,否则检验;若f((a+b)/2)f(a)<0,则以(a+b)/2代替b,否则以(a+b)/2代替a.反复执行步骤2和步骤3,直到区间[a,b]的长度小于允许误差e,此时中点(a+b)/2即为所求近似根。

2.3 程序流程图3 实验结果分析#include"stdio.h"void main(){float a,b,e,x,c;int k=0,n=1;scanf("%f,%f,%f",&a,&b,&e);while(n==1){x=(a+b)/2;c=(x*x*x-x-1)*(a*a*a-a-1);if(c<0){b=x;if(b-a<=e){printf("%f,%d\n",x,k);break;}else k++;}else{ if(c==0) { printf("%f,%d\n",x,k);break;}else { a=x; if(b-a<=e) { printf("%f,%d\n",x,k);break;}else k++;}}}}高斯塞德尔迭代法求方程组解 高斯主元素消去法求方程组解2.2 算法步骤高斯塞德尔迭代法:步骤1:给定初值)0(1)0(2)0(1,...,,n x x x ,精度ε,最大容许迭代次数M,令k=1。

步骤2:对 i=1,2,…,n 依此计算)0()1()0()1(01)0()1()1().(i i ii i iinj j j ij iix x x x e a x a xx→-=-=∑≠=步骤3:求出 e=}{max 1i ni e ≤≤,若 e<ε,则输出 )0(i x (i=1,2,..,n ),停止计算。

解微分方程算法C语言程序(精心整理版)

解微分方程算法C语言程序(精心整理版)

解微分方程算法C语言程序(精心整理版)#include<stdio.h>#include<stdlib.h>#include<math.h>#include<graphics.h>float k1,k2,k3,k4,m1,m2,m3,m4,n1,n2,n3,n4;float t,ts,tf,h;float x[1001],y[1001],z[1001],x_axis[1001];int count;void initial( ){x[0] = 1.0 ;y[0] = -1.0;z[0] = 0.0;ts = 0.0;tf = 20.0;count = 500;}void runge( ){int i = 0;h = (tf - ts)/count;for(i = 1;i <= count;i++){t = ts + (i-1)*h;k1 = -x[i-1] + 2*y[i-1] + 6*z[i-1];m1 = -y[i-1] + 3*z[i-1] + 2*sin(t);n1 = -z[i-1] + sqrt(t)*exp(-t) + cos(t);k2 = -(x[i-1] + k1*(h/2.0)) + 2*(y[i-1] + m1*(h/2.0)) + 6*(z[i-1] + n1*(h/2.0));m2 = -(y[i-1] + m1*(h/2.0)) + 3*(z[i-1] + n1*(h/2.0)) + 2*sin(t +h/2.0);n2 = -(z[i-1] + n1*(h/2.0)) + sqrt(t + h/2.0)*exp(-(t + h/2.0)) + cos(t + h/2.0);k3 = -(x[i-1] + k2*(h/2.0)) + 2*(y[i-1] + m2*(h/2.0)) + 6*(z[i-1] + n2*(h/2.0));m3 = -(y[i-1] + m2*(h/2.0)) + 3*(z[i-1] + n2*(h/2.0)) + 2*sin(t +h/2.0);n3 = -(z[i-1] + n2*(h/2.0)) + sqrt(t + h/2.0)*exp(-(t + h/2.0)) + cos(t + h/2.0);k4 = -(x[i-1] + k3*(h/2.0)) + 2*(y[i-1] + m3*(h/2.0)) + 6*(z[i-1] + n3*(h/2.0));m4 = -(y[i-1] + m3*(h/2.0)) + 3*(z[i-1] + n3*(h/2.0)) + 2*sin(t +h/2.0);n4 = -(z[i-1] + n3*(h/2.0)) + sqrt(t + h/2.0)*exp(-(t + h/2.0)) + cos(t + h/2.0);x[i] = x[i-1] + h*(k1 + 2*k2 + 2*k3 + k4)/6.0;y[i] = y[i-1] + h*(m1 + 2*m2 + 2*m3 + m4)/6.0;z[i] = z[i-1] + h*(n1 + 2*n2 + 2*n3 + n4)/6.0;}}int main( ){int i,j,k,gdriver,gmode;char s[30];initial( );runge( );for(i = 0;i <= count;i++)x_axis[i] = i;gdriver=DETECT; /*图形显示初始化*/initgraph(&gdriver,&gmode,"c:\\tc");setbkcolor(9);outtextxy(240, 40, "Runge Rutta Arithmetic"); /*标题*/ /*outtextxy(400, 445, "THE PRODUCER WANGHUI "); 制作人*/ outtextxy(150, 415, "white is x red is y blue is z"); rectangle(20, 70, 620, 430); /*各种矩形框*/rectangle(20, 70, 620, 410);line(25, 250, 595, 250); /*建立X1轴坐标*/line(595, 250, 590, 248);line(595, 250, 590, 252);outtextxy(580, 255, "t/s");/*line(330, 405, 330, 75); 建立Y1轴坐标line(330, 75, 328, 80);line(330, 75, 332, 80);outtextxy(335, 80, "h/mm");*/line(40,405,40,75); /*建立Y1轴坐标*/line(40,75,38,80);line(40,75,42,80);outtextxy(45, 80, "h/mm");/*sprintf(s, "%d", x[0]);outtextxy(18,445, s);sprintf(s, "%d", x[1]);outtextxy(26,445, s);sprintf(s, "%d", x[2]);outtextxy(34,445, s);sprintf(s, "%d", x[3]);outtextxy(42,445, s);*/for(i = 0;i <= count;i++){putpixel(40 + x_axis[i],250 - 15*x[i],15); putpixel(40 + x_axis[i],250 - 15*y[i],4); putpixel(40 + x_axis[i],250 - 15*z[i],1); setcolor(15);delay(1000); /*延时10000ms,动态输出*/}getch(); return(0); }。

c语言微分运算

c语言微分运算

c语言微分运算C语言微分运算一、引言微分运算是微积分中的重要概念,用于研究函数的变化率和曲线的切线斜率。

在C语言中,我们可以通过编写相应的代码来实现微分运算。

本文将介绍C语言中的微分运算原理和实现方法。

二、微分运算原理微分运算的原理是通过求导数来确定函数在某一点的变化率。

在C 语言中,我们可以利用函数的定义和极限的概念来进行微分运算。

以函数f(x)为例,其导数f'(x)表示函数f(x)在某一点x处的变化率。

三、C语言实现微分运算的步骤1. 定义函数我们需要定义一个函数f(x)。

在C语言中,可以使用函数来表示数学中的函数。

例如,我们可以定义一个求平方的函数:```cdouble square(double x) {return x * x;}```2. 计算导数接下来,我们可以编写一个函数来计算函数f(x)在某一点x处的导数。

在C语言中,我们可以使用差商的概念来计算导数。

差商可以通过函数在两个点的取值之差与自变量之差的比值来近似表示函数的变化率。

例如,我们可以编写一个求导数的函数:```cdouble derivative(double (*f)(double), double x) {double h = 1e-6; // 差分步长return (f(x + h) - f(x)) / h;}```3. 调用函数我们可以在主函数中调用上述定义的函数来进行微分运算。

例如,我们可以计算函数f(x)在x=2处的导数:```c#include <stdio.h>int main() {double x = 2;double result = derivative(square, x);printf("f'(%.2f) = %.2f\n", x, result);return 0;}```四、实例分析以求解函数f(x) = x^2在x=2处的导数为例,我们可以通过上述步骤来实现微分运算。

常微分方程数值解算法

常微分方程数值解算法

常微分方程数值解算法常微分方程是在物理、经济、生物、环境科学等领域中最基本的数学工具之一。

为了解决实际问题,需要求解这些方程的解。

但是,大部分常微分方程是无法求得解析解的,因此需要通过数值方法来求解。

在数值方法中,其基本思想是将微分方程化为一个逐步求解的问题。

通过离散化得到一个差分方程,然后通过数值方法求解这个差分方程。

本文将就常微分方程的数值解算法进行介绍和探讨。

1.欧拉方法欧拉方法是最基本的一种常微分方程数值解方法。

它的基本思想是将微分方程化为差分方程。

欧拉方法是一种一阶的显式方法。

通过计算当前点处的斜率即可进行逼近。

如下所示:y(t + h) = y(t) + hf(t, y(t))其中,h是步长。

f(t, y)是微分方程右边的函数。

欧拉方法的由来是其是以欧拉为名的。

这种方法的优点是简单明了,易于理解。

但是,其与真实解的误差随着步长增大而增大,误差不精,计算速度较慢等缺点也使其并非一个完美的数值解方法。

2.改进的欧拉方法改进的欧拉方法被认为是欧拉方法的一个进化版。

它是二阶数值方法,明显优于欧拉方法。

其基本思想是通过步长的平均值h/2来进行逼近。

y(t + h) = y(t) + h[ f(t, y(t)) + f(t + h, y(t) + hf(t, y(t))/2) ]其优点是能够更准确地逼近微分方程的解,只比欧拉方法多计算一些,但是其步长的误差随着步长增大而减小,并且计算速度比欧拉方法稍快。

因此,改进的欧拉方法是比欧拉方法更好的方法,效果相对较好。

3.龙格库塔方法龙格库塔方法是一种经典的数值解方法。

对于非刚性的方程可以得到较为精确的数值解。

其算法思路是利用多阶段迭代的方式,求解一些重要的插值点,并利用插值点的结果来逼近方程的解。

其公式如下:y(t + h) = y(t) + (h/6)*(k1 + 2k2 + 2k3 + k4)其中,k1 = f(t, y(t))k2 = f(t + h/2, y(t) + h/2k1)k3 = f(t + h/2, y(t) + h/2k2)k4 = f(t + h, y(t) + hk3)其优点是更精确,计算速度更快。

使用C语言解常微分方程 C ODE

使用C语言解常微分方程 C ODE

解常微分方程姓名:Vincent年级:2010,学号:1033****,组号:5(小组),4(大组)1. 数值方法:我们的实验目标是解常微分方程,其中包括几类问题。

一阶常微分初值问题,高阶常微分初值问题,常微分方程组初值问题,二阶常微分方程边值问题,二阶线性常微分方程边值问题。

对待上面的几类问题,我们分别使用不同的方法。

• 初值问题使用 龙格-库塔 来处理 • 边值问题用打靶法来处理 • 线性边值问题有限差分法初值问题我们分别使用• 二阶 龙格-库塔 方法 • 4阶 龙格-库塔 方法 来处理一阶常微分方程。

理论如下:对于这样一个方程'()(,)y t f t y =当h 很小时,我们用泰勒展开,12111111(,)(,)(,)k k k k i i k k j j i ij k hf t y k hf t h y k k hf a b a b t h y h k -===++=++∑L当我们选择正确的参数 a[i][j],b[i][j]之后,就可以近似认为这就是泰勒展开。

对于二阶,我们有:()01()()y t h y t h Af Bf+=++其中010(,)(,)P f f t y f f t y h Qhf ==++经过前人的计算机经验,我们有,选择 A=1/2,B=1/2,则 P=1,Q=1,于是又如下形式,这也使休恩方法的表达式。

所以我们称其为 龙格(库塔)休恩方法()()()(,)(,(,))2hy t h y t f t y f t h y hf t y +=++++对于4阶龙格方法,我们有类似的想法, 我们使用前人经验的出的系数,有如下公式112341213243(22),6(,),(,),22(,),22(,).n n n n n n n n n n h y y k k k k k f t y h h k f t y k h h k f t y k k f t h y hk +⎧=++++⎪⎪=⎪⎪⎪=++⎨⎪⎪=++⎪⎪=++⎪⎩对于高阶微分方程及微分方程组 我们用• 4阶龙格-库塔方法来解对于一个如下的微分方程组'111'1(,,,),(,,,).n nn n y f t y y y f t y y ⎧=⎪⎨⎪=⎩L LL 101,00,0(),()n n y t y y t y=⎧⎪⎨⎪=⎩L我们可以认为是一个一阶向量微分方程,所以可以用龙格-库塔方法的向量形式解。

实验七 用C++解常微分方程

实验七 用C++解常微分方程

实验七用C++解常微分方程1. 引言常微分方程是自变量和未知函数以及函数的导数之间的关系方程。

在科学领域中,常微分方程被广泛应用于描述物理、生物、经济等领域的各种动力学问题。

在本实验中,我们将使用C++编程语言来解决常微分方程问题。

2. 背景知识在开始解常微分方程之前,我们需要了解几个基本概念和方法:2.1 Euler方法Euler方法是一种基本的数值解常微分方程的方法。

它通过将微分方程转化为差分方程的形式,然后利用差分逼近来递推求解。

其基本公式如下:y_{n+1} = y_n + h*f(x_n, y_n)其中,`y_n` 表示在 `x = x_n` 时的未知函数的值,`f(x_n, y_n)`表示微分方程右端的函数,`h` 表示每一步的步长。

2.2 Runge-Kutta方法Runge-Kutta方法是另一种常用的数值解常微分方程的方法。

相对于Euler方法,Runge-Kutta方法的精度更高。

其中最常用的是4阶Runge-Kutta方法,其基本公式如下:y_{n+1} = y_n + (h/6)*(k_1 + 2k_2 + 2k_3 + k_4)其中,`k_1 = f(x_n, y_n)`,`k_2 = f(x_n + h/2, y_n + (h/2)*k_1)`,`k_3 = f(x_n + h/2, y_n + (h/2)*k_2)`,`k_4 = f(x_n + h, y_n + h*k_3)`。

3. 实验步骤1. 首先,我们需要根据给定的常微分方程,编写一个C++函数用于计算右端函数 `f(x, y)` 的值。

2. 接下来,我们可以选择使用Euler方法或Runge-Kutta方法来求解微分方程。

我们需要编写一个C++函数来实现所选择的方法。

3. 在主函数中,我们可以设定初始条件、步长等参数,并调用函数来求解常微分方程。

4. 最后,将求得的数值解绘制成图表,以便对结果进行可视化分析。

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

本科生课程设计报告实习课程数值分析学院名称___________________ 管理科学学院________________ 专业名称________________ 信息与计算科学 ________________ 学生姓名________________________________________________ 学生学号________________________________________________ 指导教师________________________________________________ 实验地点________________________________________________ 实验成绩________________________________________________ 二0 一六年六月—二0 一六年六摘要常微分方程数值解法是计算数学的一个分支.是解常微分方程各类定解问题的数值方法.现有的解析方法只能用于求解一些特殊类型的定解问题,实用上许多很有价值的常微分方程的解不能用初等函数来表示,常常需要求其数值解•所谓数值解,是指在求解区间内一系列离散点处给出真解的近似值.这就促成了数值方法的产生与发展.?关键词:数值解法;常微分1. 实验内容和要求常微分方程初值问题有精确解y(x) x2e x cos(2x)。

要求:分别取步长h = 0.1 , 0.01 , 0.001,采用改进的Euler 方法、4阶经典龙格-库塔R— K方法和4阶Adams预测-校正方法计算初值问题。

以表格形式列出10个等距节点上的计算值和精确值,并比较他们的计算精确度。

其中多步法需要的初值由经典R-K法提供。

运算时,取足以表示计算精度的有效位。

2. 算法说明2.1函数及变量说明1、欧拉方法:yg) y(x) hf(X i,y(X i))(i=o, 1,2,3,……n-1 )y(o)a(其中a为初值)2、改进欧拉方法:y (N J y(xj hf(x ,y(G)h~ y(x J y(X i ) 2〔f (X i ,y (G )f(x i ,y(X i 1))]y(0) a (i=0 , 1, 2……n-1中a 为初值)4、4阶adams 预测-校正方法预测:校正:Adsms 内插外插公式联合使用称为 Adams 预测-校正系统,利用 外插公式计算预测,用内插公式进行校正。

计算时需要注意以下两点:1、 外插公式为显式,内插公式为隐式。

故用内插外插公式时需要 进行迭代。

2、 这种预测-校正法是四步法,计算Yn+1时,不但用到前一步信 息,而且要用到更前三步信息f 「1,f n .2f n-3,因此它不是自动开始的, 实际计算时必须借助某种单步法,用Runge-Kutta 格式为它提供初始 值%』2肆 3 , 依据局部截断误差公式得:y i i3、经典K-R 方法: f (冷 y)h f(X i 2,y i h 2K 1)h f (X i , y i 2 2 f (X i h, y i hK 3)K 2K 4 K 3 h y i h () K i进一步将Adams预测-校正系统加工成下列方案: 运用上述方案计算y ni时,要先一步的信息y n,y n,P n C n和更前一步的信息y n-1因此在计算机之前必须给出初值y i和P i-C i,y i可用其他单步法来计算,P i-C i则一般令他为零。

3. 源程序#include<stdio.h> #include<stdlib.h>#include<windows.h>#include<math.h>// 微分方程double f(double x,double y){return (-y+cos(2*x)-2*sin(2*x)+2*x*exp(-x));//return x*pow(y,-2)*2.0/3.0;}// 原函数double p_f(double x){return x*x*exp(-x)+cos(2*x);//return pow(1.0+pow(x,2),1.0/3.0);}// 求精确解double* Exact(double a,double b,double h){int i;double c = (b-a)/h;double *y = new double [c+1];for(i=0;i<=c;i++)y[i]= p_f(a+i*h);return y;}// 欧拉方法double* Euler(double a,double b,double h,double y0){int i;double c = (b-a)/h;double *y = new double [c+1];y[0]=y0;for(i=1;i<=c;i++){y[i]= y[i-1]+ h* f(a+(i-1)*h,y[i-1]);//printf("%f\n",f(a+(i-1)*h,y[i-1]));}return y;}// 改进欧拉方法double* Euler_Pro(double a,double b,double h,double y0) {int i;double c = (b-a)/h ,yb;double *y = new double [c+1];y[0]=y0;for(i=1;i<=c;i++){yb=y[i-1] +h* f(a+(i-1)*h,y[i-1]);y[i] = y[i-1] + 0.5*h*( f(a+(i-1)*h,y[i-1]) + f(a+i*h,yb) );}return y;}// 经典K-R 方法double* K_R(double a,double b,double h,double y0) { double K1,K2,K3,K4,x;int i;double c = (b-a)/h ;double *y = new double [c+1]; y[0]=y0;for(i=1;i<=c;i++)x=a+(i-1)*h;{K1=f(x,y[i-1]);K2=f(x+0.5*h,y[i-1]+0.5*h*K1);K3=f(x+0.5*h,y[i-1]+0.5*h*K2);K4=f(x+h,y[i-1]+h*K3);y[i]=y[i-1] + h*( K1 + 2*K2 + 2*K3 + K4)/6;}return y;}〃4阶AdamS预测-校正方法double **Adams(double a,double b,double h,double y0){int i;double *y;double count = (b-a)/h;double dy[100]={0},x[4]={0};double p_0=0,p_1=0,c=0;double **r = new double *[count+1];// 动态初始化,储存预测值和校值for(i=0;i<=count;i++)r[i] = new double [2]; if(r==NULL){printf(" 内存分配失败\n");exit(0);}for(i=0;i<count;i++){r[i][0]=0;r[i][1]=0;}y=K_R(a,b,h,y0);for(i=0;i<4;i++){x[i]=a+h*i;dy[i]=f(x[i],y[i]);r[i][0]=y[i];}i=3;while(x[3]<b){x[3] = x[3]+h;p_1=y[3]+h*(55*dy[3]-59*dy[2]+37*dy[1]-9*dy[0])/24;// 预估c=p_1+251*(c-p_0)/270;// 修正r[i][0]=c;c=f(x[3],c);c=y[3]+h*(9*c+19*dy[3]-5*dy[2]+dy[1])/24; 正y[3]=c-19*(c-p_1)/270; r[i][1] = y[3];dy[0]=dy[1];dy[1]=dy[2];dy[2]=dy[3]; dy[3]=f(x[3],y[3]);p_0=p_1;i++;}return r;}void main(){int i , selet;double a=0, b=2, h=0.001, y0=1; while(1)// 求f// 校// 修正{printf(" 请输入下限,上限,步长,初值:(用空格隔开)\n");scanf("%lf %lf %lf %lf",&a,&b,&h,&y0);double c = (b-a)/h;double *yx,*y;yx=Exact(a,b,h);while(1){printf("1 、欧拉2、改进欧拉3、经典K-R4、4阶Adams 预测-校正5、修改数据6、退出\n”);scanf("%d",&selet);system("cls");if(selet==1){y=Euler(a,b,h,y0); printf(" 欧拉方法:\n");}if(selet==2){y=Euler_Pro(a,b,h,y0);printf(" 改进欧拉方法:\n");}if(selet==3){y=K_R(a,b,h,y0);printf(”经典K-R方法(4阶龙格-库塔方法):\n");}if(selet==4){double **r;r=Adams(a,b,h,y0);printf("4 阶AdamS预测-校正方法:\n");printf("x 值预估值校正值误差\n");printf("%0.3f %lf --\n",0,r[0][0]);printf("%0.3f %lf --\n",0.1,r[1][0]);printf("%0.3f %lf --\n",0.2,r[2][0]);for(i=3;i<=10;i++)printf("%0.3f %f %f %0.20f\n",a+i*h,r[i][0],r[i] [1],fabs(r[i][0]-r[i][1]));}}if(selet==1||selet==2||selet==3) {printf("x 值计算值准确值\n");for(i=0;i<=10;i++)printf("%0.3f %lf %lf %0.20f\n",(a+i)*h,y[i],yx[i] ,fabs(yx[i]-y[i]));}if(selet==5) break;if(selet==6)exit(1);continue;}误差4. 实验结果1、改进欧拉方法2、经典K-R方法3、4阶adams预测-校正法5. 对比分析通过表格可以看出:1, 在步长相同的时候,结果准确度经典心只>改进欧拉>欧拉方法>4阶adams预测校正方法2,同一个方法的情况下,步长越小结果准确度越高;参考文献:[1] 朱建新,李有法,数值计算方法(第三版),高等教育出版社;[2] Adam预测-校正系统。

相关文档
最新文档