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

如何解决SymPy求微分方程导数后subs无法代入给定点坐标求值的问题

问题解决方法

你遇到的subs方法未生效的核心原因是:SymPy所有表达式操作默认返回新的对象,不会修改原变量,你之前调用fy1.subs(...)没有接收返回值,所以打印的还是未代入的原始符号表达式。此外输入的函数是字符串格式,需要先转为SymPy可识别的表达式对象才能正常求导、代入。

完整实现步骤如下:

步骤1:正确定义符号与解析输入函数

from sympy import symbols, diff, sympify

# 提前定义所有符号变量
y1 = symbols('y1')
y = symbols('y')
u2 = symbols('u2')
u1 = symbols('u1')
u = symbols('u')

# 把输入的函数字符串转为SymPy表达式对象
f_input = input('Enter function: ')
f = sympify(f_input)

步骤2:求偏导后正确使用subs代入数值

# 对各变量求偏导
fy1 = diff(f, y1)
fy = diff(f, y)
fu2 = diff(f, u2)
fu1 = diff(f, u1)
fu = diff(f, u)

# subs方法返回代入后的新表达式,必须赋值给变量保存
fy1_val = fy1.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
fy_val = fy.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
fu2_val = fu2.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
fu1_val = fu1.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
fu_val = fu.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])

# 测试用例中此处fy1_val输出为5,符合预期
print(f"fy1值:{fy1_val}")
print(f"fy值:{fy_val}")

可选优化:封装代入逻辑减少重复代码

可以把代入逻辑封装为通用函数,避免重复写代入参数:

def calculate(expr, eval_point):
    # evalf()可将符号数值转为普通浮点数
    return expr.subs(eval_point).evalf()

# 统一配置代入点
point = {
    y1: 0,
    y: -1,
    u2: 0,
    u1: 0,
    u: -4
}

# 直接调用函数即可得到结果
fy1_val = calculate(fy1, point)
fy_val = calculate(fy, point)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 23:09:04