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方法的实现:
- 首先检查解析解/数值解的计算逻辑,确认所有位置的计算都乘了传入的
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
- 如果是数值方法实现,确认解数组初始化后第一个元素显式赋值为
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
- 检查
solve方法的参数接收逻辑,不要在内部硬编码覆盖传入的u0参数。
修改完成后重新运行测试即可通过断言。
内容的提问来源于stack exchange,提问作者N.A.
相关产品推荐
相关产品推荐

