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