微分方程c语言求解,使用C语言解常微分方程 C ODE.doc

SYSU-IFCEN 2013-2014实验报告Projet professionnel

Vincent. Wang [PAGE 22]équipe de Neutrons Dosimétrie

解常微分方程

姓名:Vincent

年级:2010,学号:1033****,组号:5(小组),4(大组)

数值方法:

我们的实验目标是解常微分方程,其中包括几类问题。一阶常微分初值问题,高阶常微分初值问题,常微分方程组初值问题,二阶常微分方程边值问题,二阶线性常微分方程边值问题。

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

初值问题

使用 龙格-库塔 来处理

边值问题

用打靶法来处理

线性边值问题

有限差分法

初值问题

我们分别使用

二阶 龙格-库塔 方法

4阶 龙格-库塔 方法

来处理一阶常微分方程。

理论如下:

对于这样一个方程

当h很小时,我们用泰勒展开,

当我们选择正确的参数 a[i][j],b[i][j]之后,就可以近似认为这就是泰勒展开。

对于二阶,我们有:

其中

经过前人的计算机经验,我们有,

选择 A=1/2,B=1/2,则 P=1,Q=1,于是又如下形式,这也使休恩方法的表达式。

所以我们称其为 龙格(库塔)休恩方法

对于4阶龙格方法,我们有类似的想法,

我们使用前人经验的出的系数,有如下公式

对于高阶微分方程及微分方程组

我们用

4阶龙格-库塔方法来解

对于一个如下的微分方程组

我们可以认为是一个一阶向量微分方程,所以可以用龙格-库塔方法的向量形式解。

对于一个高阶的微分方程,形式如下:

我们可以构建出一个一阶的微分方程组,

则有

所以我们实际只要解一个微分方程组

其中初值为

使用4阶龙格-库塔方法,

使用这个向量形式的龙格-库塔方法我们便可就出方程的数值解。

边值问题

对于边值问题,我们分为两类

一般的边值问题

线性边值微分方程

一般的边值问题,我们是使用打靶法来求解,

对于这样一个方程

主要思路是,化成初值问题来求解。

我们已有

这样我们便可求出方程的解。

线性微分方程边值问题

对于这样的问题,我们可以使用一个更加高效的方法,有限差分法。

对于如下方程

我们对其进行差分

这样的话,我们的微分方程可以写成,

于是我们得到了个线性方程组

这样的话我们求解出x

对于上面的矩阵,我们可以分解出两个三角阵,然后回代求解便可。

我们用回代法可以直接求解

至此,我们便求出了目标方程的解

流程图

二阶龙格-库塔

对于i = 0到M-1;

y[i+1] = y[i] + h / 2 * (fun(t, y[i]) + fun(t + h, y[i] + h*fun(t, y[i])));

return y;

4阶龙格-库塔

对于i = 0到M-1;

y[i + 1] = y[i] + h / 6 * (fun(t, y[i]) + 2 * fun(t + h / 2, y[i] + h / 2 * fun(t, y[i])) + 2 * fun(t + h / 2, y[i] + h / 2 * fun(t + h / 2, y[i] + h / 2 * fun(t, y[i]))) +fun(t + h, y[i]+h*fun(t + h / 2, y[i] + h / 2 * fun(t + h / 2, y[i] + h / 2 *fun(t, y[i])))));

return y;

4阶龙格-库塔解方程组

对于k= 0到M-1;

对于i= 0到N;

fun(t, y[k], dy[0])

对于i= 0到N;

tempdy[j] = y[k][j] + h / 2 * dy[0][j];

fun(t + h / 2, tempdy, dy[1]);

对于i= 0到N;

tempdy[j] = y[k][j] + h / 2 * dy[1][j];

fun(t + h / 2, tempdy, dy[2]);

对于i= 0到N;

tempdy[j] = y[k][j] + h * dy[2][j];

fun(t + h, tempdy, dy[3]);

y[k+1][i] = y[k][i] + h / 6 * (dy[0][i] + 2 * dy[1][i] + 2 * dy[2][i] + dy[3][i]);

return y;

打靶法

当err

y = RKSystem4th( fun, 2, t0, u, tn, M);

f0 = y[M-1][0] - b;

u[1] = y[0][1];

y = RKSystem4th( fun, 2, t0, v,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值