【问题标题】:Solving a state-space (2nd order equation) with ode45 in MATLAB在 MATLAB 中使用 ode45 求解状态空间(二阶方程)
【发布时间】:2013-11-24 01:09:53
【问题描述】:

我正在尝试自学如何使用 MATLAB 解决状态空间系统,我有一个看似非常简单的系统,但到目前为止还没有为新手找到任何体面的简单示例.

我想要一个简单的演练,了解如何将系统转换为 MATLAB、设置哪些变量以及如何求解大约 50(?) 秒(从 t=0 到 50 或任何值)。

我想使用 ode45,因为它是使用 Runge-Kutta 变体的四阶方法。

这是二阶方程:

θ''+0.03|θ'|θ'+4pi^2*sinθ=0

状态空间:

x_1'=x_2

x_2'=-4pi^2*sin(x_1)-0.03|x_2|x_2

x_1 = θ, x_2 = θ'

θ(0)=pi/9 rad, θ'(0)=0, h(step)=1

【问题讨论】:

  • 帮助页面中的示例怎么样? link你在纠结什么?
  • 例如,even in this example 我不明白如何将我的状态空间系统转换为 ode45 可以理解的方程组。 (刚开始使用MATLAB)
  • 走过? Here you go.

标签: matlab math signal-processing ode


【解决方案1】:

您需要一个导数函数,它在给定系统当前状态和当前时间的情况下,返回所有状态变量的导数。通常这个函数的形式是

function xDash=derivative(t,x)

xDash 是一个向量,每个元素的导数,x 是状态变量的向量。如果您的变量称为x_1x_2 等,最好将x_1 放入x(1) 等。然后您需要一个公式来计算每个状态变量相对于其他状态变量的导数,例如,您可以拥有xDash_1=x_1-x_2,并将其编码为xDash(1)=x(1)-x(2)。希望这可以解决问题。

对于你的例子,导数函数看起来像

function xDash=derivative(t,x)
    xDash=zeros(2,1);
    xDash(1)=x(2);
    xDash(2)=-4*pi^2*sin(x(1))-0.03*abs(x(2))*x(2);
end

你会使用解决系统

[T,X]=ode45(@derivative,0:50,[pi/9 0]);

这会在t=0,1,2,...,50 处提供输出。

【讨论】:

  • 好吧,在上面,你在sin函数中使用了x(1),但是好像没有设置x_1或者x(1)?
  • 由于x 是函数的输入,我们知道它的值。我们使用[pi/9 0] 设置x(1)x(2) 的初始值,然后在每个时间步更新它们。
  • 你的代码可以运行吗?我收到错误消息“无法评估所选部分,因为它包含无效语句”。它在抱怨 t 未被使用。
  • 根据您的 Matlab 版本有多新,您可以将derivative 定义中的t 替换为波浪号~。但代码在我的电脑上运行良好。
  • 我在 Mac 上使用 R2012b,不确定,但我可能只是将所有内容转换为单独的符号变量,然后调用它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多