在Octave中定义微分方程

时间:2014-03-21 07:30:05

标签: octave differential-equations

我试图使用Octave来使用Euler方法求解微分方程。

Euler方法给了我(并且是正确的),它适用于给定的初始值问题,

y*y'' + (y')^2 + 1 = 0; y(1) = 1;

初始值问题在以下Octave函数中定义:

function [YDOT] = f(t, Y)

YDOT(1) = Y(2);
YDOT(2) = -(1 + Y(2)^2)/Y(1);

我的问题是这个函数定义。为什么YDOT(1)!= 1?什么是Y(2)? 我没有找到任何关于函数定义的文档,使用函数[YDOT]而不是简单的函数YDOT,我将不胜感激任何有关Octave代码正在做什么的澄清。

1 个答案:

答案 0 :(得分:0)

首先要做的事情是:你有一个二阶(非线性)微分方程,它要求你有两个初始条件。因此,上面给出的信息是不够的。

以下内容定义为进一步说明:A==B表示A is identical to B; A=>B表示B follows from A

看来你混合了一些东西。给你文件的那个人用以下方式重写了这个等式:

y*y'' + (y')^2 + 1 = 0; y(1) = 1; | (I) y := y1 & (II) y' := y2

(I) & (II)=>(III): y' = y2 = y1' | y2==Y(2) & y1'==YDOT(1) 

Ocatve是“矩阵/向量导向”,因此我们在向量或矩阵中编写所有内容。而是写y1=alphay2=beta而是在y=[alpha; beta]y(1)==y1=alphay(2)==y2=beta。您很快就会意识到使用这种数学形式化来解决所有问题的巨大优势。

(III) & f(t,Y)=>(IV): y2' == YDOT(2) = y'' = (-1 -(y')^2) / y

现在回想一下y'y中定义的(I)(II)

y' = y2 == Y(2) & y = y1 == Y(1)

所以我们可以重写等式(IV)

(IV): y2' == YDOT(2) = (-1 -(y')^2) / y == -(1 + Y(2)^2)/Y(1)

因此,从公式(III)(IV)我们可以得出您已经知道的内容:

YDOT(1) = Y(2)
YDOT(2) = -(1 + Y(2)^2)/Y(1)

将这些方程传递给求解器。通过将近邻中的“下一个”值检索到某个“先前已知”的值,以数字方式求解所有类型的微分方程。 (这个邻域内的步长是编写求解器时的关键问题之一!)因此,求解器使用初始条件Y(1)==y(1)=1进行下一步并计算“下一步”值。所以就在开始时YDOT(1)=Y(2)==y(2)你没有告诉我们这个值!但从那时起YDOT(1)由求解器改变,依赖于函数形状来解决你的问题并给你一个独特的y(t)解决方案。

您似乎是第一次使用Octave,所以让我们对function [YDOT] = f(t, Y)做最后评论。通常,函数以这种方式定义:

function[retVal1, retVal2, ...] = myArbitraryName(arg1, arg2, ...)

retValreturn value outputarg argumentinput