You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多次使用scipy.solve_ivp求解变扭矩ODE异常问题排查

使用scipy.solve_ivp求解ODE时数值异常问题

TLDR:使用scipy.solve_ivp求解电机驱动旋转机翼扭矩的ODE,结果数值异常(phi'达1e12、phi''达1e26),无法定位原因。

我需要求解的方程为:phi'' = a*torque_{motor}-b*(phi')^2,其中a、b是常数,torque_{motor}会在每次迭代中更新。我的思路是分时间窗口[t,t+dt]、[t+dt,t+2dt]...循环求解该ODE,每个窗口内给torque_motor赋予一个新的浮点值,以此模拟电机在不同时间步施加不同力矩。

最小可运行代码

import numpy as np
from scipy.integrate import solve_ivp

class Solver():
    def __init__(self):
        self.torque = 0

    def set_torque(self, new):
        self.torque = new

    def phi_derivatives(self, t, y):
        """
        定义待求解的ODE:I * phi_ddot = tau_z - tau_drag.
        将y视为向量 y = [phi,phi_dot],求解 dy/dt = f(y,t)
        """
        # 常数取值
        a = 1090179.6616082331
        b = 271.9406850484702

        phi, phi_dot = y[0], y[1]
        dy_dt = [phi_dot, a * self.torque - b * (phi_dot ** 2)]
        return dy_dt

# 初始化存储数组
phi_arr = []
phi_dot_arr = []
phi_ddot_arr = []
phi_0 = 0
phi_dot_0 = 0.01
start_t = 0
end_t = 0.05
delta_t = 0.001
s = Solver()
# 生成正弦波扭矩序列
sin_torques = np.sin(2 * np.pi * np.linspace(0, 1, 20))

for torque in sin_torques:
    s.set_torque(torque)
    sol = solve_ivp(s.phi_derivatives, t_span=(start_t, end_t), y0=[phi_0, phi_dot_0])
    phi, phi_dot = sol.y
    _, phi_ddot = s.phi_derivatives(0, [phi, phi_dot])
    phi_arr.append(phi)
    phi_dot_arr.append(phi_dot)
    phi_ddot_arr.append(phi_ddot)

    # 更新下一个时间窗口的初始条件和时间范围
    phi_0 = phi[-1]
    phi_dot_0 = phi_dot[-1]
    start_t = end_t
    end_t += 0.05

# 合并数组
phi_arr = np.concatenate(phi_arr)
phi_dot_arr = np.concatenate(phi_dot_arr)
phi_ddot_arr = np.concatenate(phi_ddot_arr)

问题

每个时间窗口的扭矩值取自正弦波,我原本预期phi会随扭矩方向变化产生振荡,但实际得到的phi'和phi''数值异常,量级分别达到1e12和1e26。请问这是实现上的问题吗?


内容的提问来源于stack exchange,提问作者Hadar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:24:25