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

Python用solve_ivp求解指数衰减时初始值为0输出1.0问题排查

问题根因

你的测试代码逻辑没有问题,问题完全出在自主实现的ExponentialDecay类的solve方法中,常见的错误点有三个:

  • 解析解公式写错:指数衰减的解析解为u(t) = u0 * exp(-a*t),如果实现时漏乘了传入的u0,直接写为exp(-a*t),那么t=0时的计算结果固定为1.0,和你的报错完全吻合。
  • 初始值被硬编码覆盖:solve方法内部把初始值写死为1.0,没有使用传入的u0参数。
  • 数值求解逻辑错误:用欧拉法、龙格库塔法等数值方法求解时,没有把传入的u0赋值给解数组的第一个元素,或者直接把第一步迭代的计算结果放到了索引0的位置。
修复方案

按优先级检查修改solve方法的实现:

  1. 首先检查解析解/数值解的计算逻辑,确认所有位置的计算都乘了传入的u0,示例正确的解析解实现:
import numpy as np
class ExponentialDecay:
    def __init__(self, a):
        self.a = a
    # 解析解实现的正确写法
    def solve(self, u0, T, n):
        t = np.linspace(0, T, n)
        u = u0 * np.exp(-self.a * t) # 不要漏乘u0
        return t, u
  1. 如果是数值方法实现,确认解数组初始化后第一个元素显式赋值为u0,迭代从索引1开始,示例正确的欧拉法实现:
def solve(self, u0, T, n):
    t = np.linspace(0, T, n)
    dt = t[1] - t[0]
    u = np.zeros(n)
    u[0] = u0 # 必须给第一个元素赋值为传入的初始值
    for i in range(1, n):
        u[i] = u[i-1] - self.a * u[i-1] * dt
    return t, u
  1. 检查solve方法的参数接收逻辑,不要在内部硬编码覆盖传入的u0参数。

修改完成后重新运行测试即可通过断言。

内容的提问来源于stack exchange,提问作者N.A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:36:03