SageMath封装生成可调用符号表达式序列函数的报错咨询
问题2解答:封装函数报错的原因
Sage中f(变量名) = 表达式是Sage预处理器提供的语法糖,不属于原生Python语法,它的处理逻辑是:
- 全局作用域下使用时,预处理器会直接查找已定义的同名符号变量完成绑定,你全局写
f(x)=0时x已经提前通过var('x')定义为符号变量,因此可以正常运行。 - 函数作用域下使用时,Sage预处理器会强制把括号内的标识符当成符号变量的字符串名称,调用内置的
var()函数获取对应符号,你在foo函数中写f(var) = 0时,预处理器会执行var("var")尝试获取名为"var"的符号,和你传入的名为x的函数入参完全无关,同时你原foo函数的循环内还错误使用了全局变量x而非入参var,双重问题导致类型转换报错。
问题1解答:更优的实现方案
不需要额外传入零函数,直接调用.function()方法显式初始化可调用符号函数即可,正确代码如下:
def foo(var, N): # 显式初始化以var为参数的零值可调用符号函数 f = symbolic_expression(0).function(var) for n in range(N): tmp = function(f'f{n}')(var) f += tmp * var^n return f # 调用测试 var('x') f = foo(x,5) print(f)
运行后即可得到和全局代码一致的输出:x |--> x^4*f4(x) + x^3*f3(x) + x^2*f2(x) + x*f1(x) + f0(x)
内容的提问来源于stack exchange,提问作者user2509663
相关产品推荐
相关产品推荐

