Math 用Scilab求解隐式ODE系统

Math 用Scilab求解隐式ODE系统,math,physics,modeling,ode,scilab,Math,Physics,Modeling,Ode,Scilab,我正在为桥式起重机建模,并获得以下方程式: 说到Scilab,我是个傻瓜,到目前为止,我只模拟了(使用ODE)不超过两个自由度的线性系统,这些系统很简单,我可以很容易地转换为am矩阵,并使用ODE对其进行积分 特别是这个系统,我不知道如何模拟它,不是因为sin和cos函数,而是因为我不知道如何把它放到状态空间矩阵中 我已经找了一些教程(如下所列),但我一个都不懂,有人能告诉我怎么做,或者至少告诉我在哪里可以学习吗 谢谢你,对我的英语感到抱歉通常的形式是用一阶导数写作。因此,你将有一个关系式

我正在为桥式起重机建模,并获得以下方程式:

说到Scilab,我是个傻瓜,到目前为止,我只模拟了(使用ODE)不超过两个自由度的线性系统,这些系统很简单,我可以很容易地转换为am矩阵,并使用ODE对其进行积分

特别是这个系统,我不知道如何模拟它,不是因为sin和cos函数,而是因为我不知道如何把它放到状态空间矩阵中

我已经找了一些教程(如下所列),但我一个都不懂,有人能告诉我怎么做,或者至少告诉我在哪里可以学习吗


谢谢你,对我的英语感到抱歉

通常的形式是用一阶导数写作。因此,你将有一个关系式,其中二阶导数项将写成:

x'' = d(x')/fx

把这些代入你的方程式中。在适当的初始条件下,你将得到八个同时求解的常微分方程,而不是四个。

通常的形式是用一阶导数来写。因此,你将有一个关系式,其中二阶导数项将写成:

x'' = d(x')/fx

把这些代入你的方程式中。在适当的初始条件下,您将得到八个同时求解的ODE,而不是四个。

虽然此ODE系统是隐式的,但您可以通过以下方式使用经典(显式)ODE解算器进行求解:如果您定义
X=(X,L,θ,q)^T
,则可以使用矩阵代数将系统重新表述为
a(X,X')*X“=B(X,X')
。请注意,此系统的第一个订单是

d/dt(X,X') = ( X', A(X,X')^(-1)*B(X,X') )
假设现在您已经定义了两个Scilab函数
A
B
,它们实际将其值w.r.t.计算为
X
X'

function out = A(X,Xprime)
    x=X(1)
    L=X(2)
    theta=X(3)
    qa=X(4)
    xd=XPrime(1)
    Ld=XPrime(2)
    thetad=XPrime(3)
    qa=XPrime(4);
    ...
end
function out = B(X,Xprime)
    ...
end
然后,由8个ode组成的系统的右侧,如Scilab的
ode
功能所示,可按如下方式进行编码

function dstate_dt = rhs(t,state)
    X      = state(1:4);
    Xprime = state(5:8);
    out    = [ Xprime
               A(X,Xprime) \ B(X,Xprime)]
end

根据给定的方程编写
A()
B()
的代码是唯一剩下的(但相当简单)任务。

尽管这个ODE系统是隐式的,但你可以用一个经典的(显式的)ODE解算器来解决它,方法是:如果你定义
X=(X,L,θ,q)^T
然后可以使用矩阵代数将系统重新格式化为
A(X,X')*X“=B(X,X')
。请注意,此系统的一阶形式为

d/dt(X,X') = ( X', A(X,X')^(-1)*B(X,X') )
假设现在您已经定义了两个Scilab函数
A
B
,它们实际将其值w.r.t.计算为
X
X'

function out = A(X,Xprime)
    x=X(1)
    L=X(2)
    theta=X(3)
    qa=X(4)
    xd=XPrime(1)
    Ld=XPrime(2)
    thetad=XPrime(3)
    qa=XPrime(4);
    ...
end
function out = B(X,Xprime)
    ...
end
然后,由8个ode组成的系统的右侧,如Scilab的
ode
功能所示,可按如下方式进行编码

function dstate_dt = rhs(t,state)
    X      = state(1:4);
    Xprime = state(5:8);
    out    = [ Xprime
               A(X,Xprime) \ B(X,Xprime)]
end

根据给定的方程式编写
A()
B()
的代码是唯一剩下的(但相当简单)任务。

您可能的意思是
x'=f(x,x')
变成
x'=x1
x1'=f(x,x1)
。否则
x'=x'
意味着解决方案应该是
x(t)=c1*exp(t)+c2
。我做得很糟糕。你是对的。所有的二阶导数都需要表示为一阶常微分。你的意思可能是
x'=f(x,x')
变成
x'=x1
x1'=f(x,x1)
。否则
x'=x'
意味着解应该是
x(t)=c1*exp(t)+c2
。我做得很糟糕。你说得对。所有二阶导数都需要表示为一阶常微分。