问题标签 [ode45]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
matlab - 使用 ode45 求解微分方程时遇到问题(初始条件向量错误?)
您好,我正在尝试设置一个 ode45 来求解这个微分方程 ρaCaVdTin/dT= Qshort - Qconv,cond - Qinfilt 其中 Qshort Qconv 和 Qinflit 都是描述温室中热量损失或增益的方程。
我想要实现的是通过给出外部温度风速和光强度的列向量变量,我希望 ode45 为我提供外部温度风速等对应值的内部温度,即我希望 Tin(1) 来来自 ode45,它将使用我的 tspan 中的第一个时间值、第一个外部温度等。
我通过在函数中输入断点对其进行编码的方式我注意到,从我的代码第一次执行开始,内部温度向量已经是一个 297x1 列向量,长度与我的 tspan 相同。越过 dT 的断点会导致错误初始条件向量必须与返回的向量具有相同数量的元素。问题是,有没有一种方法可以实现我的预期结果,正如我上面所说的 ode45 使用我的向量的一个值来获得一个结果?抱歉我的英语不好,这不是我的第一语言,提前感谢。
这是我的主要程序
这是我的功能
matlab - 如何使用 ODE45(涉及代数方程)求解这个由 5 个方程组成的系统?
我是一名经验丰富的Matlab程序员,但我不知道如何解决这个(看似)简单的问题。我有一个由 5 个方程和 5 个未知数组成的系统:
当不涉及代数方程时,我知道如何使用 ode45 求解 ODE 。在上述系统中,V(速度)和C(加速度)都是常数且已知的。 C 为航天器横向加速度。
这个问题应该解决如下:
- 在 t=0 时,我们知道 Theta(0)、x(0) 和 y(0)。请记住,V 和 C 都是常数且已知的。
- 给定 Theta(0) 和 C/V,我们得到 Theta(t1) 积分第 4 个方程。有了这个新的 Theta 值,我们应该能够计算新的 Vx(t1) 和 Vy(t1),这将为我们提供 x(t1) 和 y(t2) 的新值。
- 重复
使用 Matlab 的 ODE45 解决问题很重要,因为当我添加风、不同的重力和密度、航天器的质量和几何形状(以及惯性等等!)时,它最终会变得非常难以解决。所以我会得到一个由几十个方程组成的系统,它们都将被耦合。如果我知道如何在 Matlab 中解决这个简单的问题,我将了解如何在未来解决更复杂的问题。
我搜索了互联网以寻求帮助,但徒劳无功。非常感激您的帮忙。
matlab - ODE 事件数随不同条件简单 ODE 变化
我有以下简单的 ODE:
初始条件 x(0)=5,我对 x(t)==1 感兴趣。所以我有以下事件功能:
这应该在 t=4 时产生一个事件。但是,如果我运行以下代码,我会得到两个事件,一个在 t=4,一个在附近的位置 t=4+5.7e-14:
如果我运行类似的代码来查找 x(t)==0 或 x(t)==-1 (分别为 value = x; 或 value = x+1; ),我只有一个事件。为什么这会产生两个事件?
更新:如果选项结构更改为以下内容:
...那么 ODE 仅在 t=4+5.7e-14 返回一个事件。如果 'RelTol' 设置为 1e-5,它会在 t=4 时返回一个事件。如果 'RelTol' 设置为 1e-8,它返回与默认相同的两个事件 ('RelTol'=1e-3)。此外,将初始条件从 x(0)=5 更改为 x(0)=4 会产生一个事件,但设置 x(0)=4 和 'RelTol'=1e-8 会产生两个事件。
更新 2:观察 sol.x 和 sol.y 输出(分别为 t 和 x),时间以整数 [0 1 2 3 4 5 6 7...] 进行,并且 x 作为整数进行直到 x(t =5) 像这样:[5 4 3 2 1 1.11e-16 -1.000 -2.000...]。这表明在 t=4 和 t=5 之间发生了一些事情,在 ODE 解决方案中产生了“凹凸”。为什么?
matlab - 解决最优控制问题,ode45 与 fmincon
下午好!
首先,我找了一段时间类似的问题,但是(可能是因为我的经验不足)我没有发现任何与我要问的类似的问题。
我是第一次使用matlab来解决这类问题,所以不知道该怎么办。简要说明:
我正在为我的 Optimal Control 课程做一个项目:我必须复制一篇关于就业的论文的结果,但我被情节困住了。我有以下数据:
- 五个变量函数(U(t)、T(t)、R(t)、V1(t) 和 V2(t))
- 四个控制函数(u1(t)、u2(t)、u3(t)、u4(t))
- 对控制变量的约束(每个 u 必须介于 0 和 1 之间)
- U、T、R、V1 和 V2 的初始值(在 t=0 时,特别是 V1 和 V2 在时间上是恒定的)
- 哈密顿算式中 λ 系数的最终值
(注意:对于控件,我已经找到了最优表达式,形式如下:ui = min{1, max{0,"expression"}}。如果需要,我也可以给出四个表达式,忽略综合一点)
在教授的建议下,我尝试使用 fmincon,理论上应该直接为我提供仅使用问题的成本函数绘制一些结果所需的信息。但在这种情况下,我在计算中遇到了一些涉及时间的问题。下面是我用于 fmincon 的代码:
使用这段代码,我(显然)只得到每个变量的一个值作为结果,并且由于我没有找到任何涉及时间的方法,正如我之前所说,我开始寻找其他解决策略。
我发现 ode45 是一个微分方程求解器,算法中已经包含了“时间迭代”,所以我尝试编写代码来解决我的问题。我从论文中取出所有方程并将它们放入一个向量中,如 mathworks 示例中所示,这是我的 matlab 文件:
使用此代码,我收到以下错误:
我找不到解决方案,因为我已经使用了论文中给出的所有初始值。我剩下的唯一值是 lambda 系数的最终值,因为它们是最终值,我不确定它们是否可以使用。在这种情况下,我也无法理解应该在哪里设置控制变量的界限。
为了完整起见,我还将提供相关论文的链接: https ://www.ripublication.com/ijss17/ijssv12n3_13.pdf
你能帮我弄清楚我能做些什么来解决我的问题吗?
PS:我知道这是一个非常糟糕的代码,但我基于 mathworks 的基础教程;当然,这应该需要在各种文件中进行重构和排序(例如,一个用于成本函数,一个用于约束),但首先我想了解问题出在哪里,然后我会将所有文件都放在一个漂亮的形式中。
太感谢了!
matlab - ode45 函数的输入参数不足
我正在设置一个函数,该函数可以求解具有所列参数的激光系统的以下微分方程。但是,每当我运行我的代码时,我都会不断收到错误,即方程(dydt)没有足够的输入参数。我不确定代码中的错误发生在哪里,但我相信这可能与我定义 y 的方式有关。我希望在图中得到高斯分布,但代码一直停在 dydt。它不处理变量。谢谢!
matlab - 时变输入 ODE 求解
我正在尝试使用ode45
. 我的一些参数已经是时间的函数,但我不断收到错误。
其中obz
和是每个向量,例如vr
:vl
我使用以下语法:
但不断R15
收到错误:
赋值比非单子下标有更多的非单子右轴维度
如何解决这个问题?
matlab - 有没有办法绘制一个带有方程(来自 ODE 系统)的函数 f?
我正在尝试为我的微分方程课解决这个作业,但遇到了一些问题。
鉴于此 ODE 系统:
与omega=3
. 初始值:y(1)=0; y(2)=4; y(3)=1;
在和f
之间绘制:t=0
t=20
我首先尝试使用以下代码使用 ODE45 模拟方程组:
在编辑器上:
在命令选项卡上:
我得到一个带有以下错误的空白图表:
所以我的问题是要绘制的步骤(或命令)是什么f
?
我正在使用 MATLAB R2019a。
matlab - 将额外的迭代相关输入传递给 ode45
ode45
我正在尝试使用该函数求解微分方程。考虑以下代码,
其中参数C1
、C2
和是列向量C3
,C4
它应该可用于ode45
引用 ( fun.m
) 的函数。我希望在每次迭代后改变值,例如,在开始时C1
I want in 的条目是C1(1)
,在下一次迭代中是C1(2)
,等等。
我该如何实施?
matlab - 带方程的 Ode45
我在将四个二阶微分方程正确输入 ode.45 函数时遇到问题。
和功能
它只是卡住了,不会在 ode45 上执行单循环。
matlab - 如何在 MatLab 中使用 ode45 修复分配错误(ode45 函数的第 488 行)
我正在尝试编写一个脚本,用于将卫星的运动方程ode45
整合到Mars 附近的双曲线轨迹上。
我需要整合行星周围的整个通道:从 SOI 半径 ( 576000km
) 开始,向行星前进,然后穿过大气层,直到卫星到达“ opposite
”大气层边界(250km
从地表开始)。
当它在输入中接收到tspan
高于大约200000
几秒(我需要大约400000
几秒)时,Matlab 会给我这个消息:
“无法执行分配,因为左侧的大小是 4×2,而右侧的大小是 4×5。” 它说
error happens in line 488 of Ode45
.
我搜索了一些类似的案例,但找不到任何东西,而且我不知道如何使用条件断点来找出复杂函数(例如 ode45)的某些内容。我还使用“”尝试了不同的选项,odeset
但没有任何改变。我不知道错误可能出在哪里。
这是脚本,我在其中使用了两个附加函数来获取一些参数:
这是“ parasint
”功能:
这是“ time
”功能:
这是 ode45 的输入函数:
这是dens
通过大气插值数据的“”函数:
这是 Matlab 给我的错误:
无法执行分配,因为左侧的大小是 4×2,而右侧的大小是 4×5。
错误
ode45 (line 488)
yout(:,idx) = yout_new
;错误
MainCur (line 59)
[t,Y]=ode45(@(t,y) eqMotoCur(t,y),I,y0,options)
;
先感谢您。