Python实现Fractional Differentiation出现TypeError报错咨询
报错原因分析
- 变量名冲突:函数入参命名为
x,但函数内部第一行又将x定义为sympy符号变量,直接覆盖了传入的训练数据集数值,导致后续运算对象全是符号而非实际数据。 - 数值函数调用参数错误:通过
lambdify生成的d4fdx4_f是可接收数值/数组的数值运算函数,但你调用时传入的是sympy符号变量x,符号对象传入numpy的ufunc通用函数时无法被识别,就触发了“Pow类型没有可调用的sin方法”的类型错误。 - 函数无返回值:原函数没有写return语句,执行完后赋值给
X_train_vectorized的结果会是None,属于隐性bug。 - 额外问题:当前代码实际计算的是4阶整数导数,并未实现你需要的分数阶微分逻辑。
修复方案
先给出解决报错的可运行基础代码,如需适配分数阶微分按注释调整即可:
import sympy as smp import numpy as np def fractional_derivative(input_arr): # 符号变量不和入参重名,避免覆盖 x_sym, a, b, c = smp.symbols('x_sym a b c', real = True) f = smp.exp(-a*smp.sin(x_sym**2)) * smp.sin(b**x_sym) * smp.log(c * smp.sin(x_sym)**2 /x_sym) # 如需分数阶微分,直接把阶数4替换为你需要的非整数即可,sympy原生支持 dfdx_order = smp.diff(f, x_sym, 4).evalf() # 指定numpy后端适配数组输入 dfdx_f = smp.lambdify((x_sym, a, b, c) , dfdx_order, modules='numpy') # 传入实际输入数组计算结果 y = dfdx_f(input_arr, a=1, b=2, c=3) print("Successfully Implemented and new feature are created based on Fractional Derivative.") # 补充返回值 return y # 调用示例 # X_train_vectorized = fractional_derivative(X_train_vectorized)
内容的提问来源于stack exchange,提问作者Asif Khan
相关产品推荐
相关产品推荐

