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

SymPy函数f_approx传入数值报错:ValueError: First variable cannot be a number: 0

问题:SymPy泰勒展开函数无法接受数值输入

原代码与报错

原代码:

import sympy as sp

x=sp.Symbol("x")

def f_approx(x, x_0 = 0, n = 10, f = sp.sin(x)):
    
    y = 0
    
    for i in range(0, n):
            
        v = sp.diff(f, x, i)[text]  # 此处[text]为无效笔误
        
        y = y + (v.evalf(subs={x: x_0})/sp.factorial(i))*(x-x_0)**i
        
    return y

print(f_approx(0))

运行后触发报错:

ValueError: First variable cannot be a number: 0

但执行display(sp.Eq(sp.S('T(x)'), f_approx(x)))能得到正确的泰勒展开式。

错误原因

  1. 参数命名冲突:函数参数x和全局定义的符号变量x重名。传入数值0时,函数内部的x被覆盖为数值,而sp.diff需要符号变量才能求导,因此报错。
  2. 无效笔误:代码中的[text]是错误写法,必须删除,否则即使传入符号也会报错。
  3. 默认参数绑定问题:默认参数f = sp.sin(x)在函数定义时就绑定了全局的x,参数冲突后会导致逻辑混乱。

修复后的代码

import sympy as sp

# 全局定义符号变量,与函数输入参数区分开
x_sym = sp.Symbol("x")

def f_approx(input_val, x_0=0, n=10, f=sp.sin(x_sym)):
    y = 0
    for i in range(n):
        # 移除无效的[text],对符号变量求i阶导数
        v = sp.diff(f, x_sym, i)
        # 计算泰勒展开的每一项并累加
        term = (v.evalf(subs={x_sym: x_0}) / sp.factorial(i)) * (x_sym - x_0)**i
        y += term
    
    # 根据输入类型返回对应结果:数值输入返回计算值,符号输入返回展开式
    if isinstance(input_val, (int, float)):
        return y.evalf(subs={x_sym: input_val})
    else:
        return y

# 测试数值输入
print(f_approx(0))  # 输出0.0
# 测试符号输入,显示泰勒展开式
sp.display(sp.Eq(sp.S('T(x)'), f_approx(x_sym)))

关键修改说明

  • 将函数参数名改为input_val,彻底避免与符号变量的命名冲突;
  • 删除了无效的[text]笔误;
  • 增加类型判断逻辑,自动适配数值/符号两种输入场景;
  • 全局符号变量命名为x_sym,明确区分符号与数值的作用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 09:57:35