首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SageMath:定义一系列函数(可调用的符号表达式)

SageMath:定义一系列函数(可调用的符号表达式)
EN

Stack Overflow用户
提问于 2021-10-26 12:27:30
回答 1查看 31关注 0票数 1

我使用的是sage 9.4和python 3.9.5。我尝试定义一个函数,它返回一系列可调用的符号表达式(函数)。该系列的定义如下:

代码语言:javascript
复制
var('x')
f(x) = 0
for n in range(5):
    tmp = function('f'+str(n))(x)
    f += tmp*x^n
print(f)

它提供了

代码语言:javascript
复制
x |--> x^4*f4(x) + x^3*f3(x) + x^2*f2(x) + x*f1(x) + f0(x)

但是,当我试图将其封装在一个函数中时

代码语言:javascript
复制
def foo (var, N):
    f(var) = 0
    for n in range(N):
        tmp = function('f'+str(n))(x)
        f += tmp*x^n
    return f
var('x')
f = foo(x,5)
print(f)

它不能使用

代码语言:javascript
复制
    /home/users/.../foo.sage.py:8: DeprecationWarning: Substitution using function-call syntax and unnamed arguments is deprecated and will be removed from a future release of Sage; you can use named arguments instead, like EXPR(x=..., y=...)
See http://trac.sagemath.org/5930 for details.
  __tmp__=var("var"); f = symbolic_expression(_sage_const_0 ).function(var)
Traceback (most recent call last):
  File "sage/symbolic/expression.pyx", line 3543, in sage.symbolic.expression.Expression.coerce_in (build/cythonized/sage/symbolic/expression.cpp:24454)
TypeError: Cannot convert str to sage.symbolic.expression.Expression

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/users/.../foo.sage.py", line 14, in <module>
    f = foo(x,_sage_const_5 )
  File "/home/users/.../foo.sage.py", line 8, in foo
    __tmp__=var("var"); f = symbolic_expression(_sage_const_0 ).function(var)
  File "sage/symbolic/expression.pyx", line 5775, in sage.symbolic.expression.Expression.__call__ (build/cythonized/sage/symbolic/expression.cpp:33252)
  File "sage/symbolic/ring.pyx", line 1146, in sage.symbolic.ring.SymbolicRing._call_element_ (build/cythonized/sage/symbolic/ring.cpp:12914)
  File "sage/symbolic/expression.pyx", line 5631, in sage.symbolic.expression.Expression.substitute (build/cythonized/sage/symbolic/expression.cpp:32326)
  File "sage/symbolic/expression.pyx", line 3545, in sage.symbolic.expression.Expression.coerce_in (build/cythonized/sage/symbolic/expression.cpp:24506)
  File "sage/structure/parent_old.pyx", line 179, in sage.structure.parent_old.Parent._coerce_ (build/cythonized/sage/structure/parent_old.c:3805)
  File "sage/structure/parent.pyx", line 1207, in sage.structure.parent.Parent.coerce (build/cythonized/sage/structure/parent.c:10940)
TypeError: no canonical coercion from <class 'str'> to Symbolic Ring

但是,我发现了一种解决方法:

代码语言:javascript
复制
def bar(var,N,zero_callable):
    f = zero_callable
    for n in range(N):
        tmp = function('f'+str(n))(var)
        f += tmp*var^n
    return f

f(x) = 0
expr = bar(x,5,f)
print(expr)

从我的角度来看,这种解决方案很不方便,因为需要将“零”作为函数参数传递,该参数仅用于初始化函数内部的变量。我的第一个问题是,这个问题是否有更好的解决方案。我对Sage/Python比较陌生,我的第二个问题是为什么foo函数不能工作,因为我正在做和上面一样的工作,只是把它包装在def环境中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-26 19:53:14

我认为,问题的根本原因是str类型和Symbolic Ring之间没有关系,我想您想要达到的目的如下所示。

代码语言:javascript
复制
def foo(x, N):
    f(x) = sum([function('f'+str(n))(x) for n in range(N)])
    return f
代码语言:javascript
复制
x = var('x')
y = var('y')
代码语言:javascript
复制
f = foo(y, 20)
g = foo(x, 10)
代码语言:javascript
复制
f
y |--> y^19*f19(y) + y^18*f18(y) + y^17*f17(y) + y^16*f16(y) + y^15*f15(y) + y^14*f14(y) + y^13*f13(y) + y^12*f12(y) + y^11*f11(y) + y^10*f10(y) + y^9*f9(y) + y^8*f8(y) + y^7*f7(y) + y^6*f6(y) + y^5*f5(y) + y^4*f4(y) + y^3*f3(y) + y^2*f2(y) + y*f1(y) + f0(y)
代码语言:javascript
复制
g
x |--> x^9*f9(x) + x^8*f8(x) + x^7*f7(x) + x^6*f6(x) + x^5*f5(x) + x^4*f4(x) + x^3*f3(x) + x^2*f2(x) + x*f1(x) + f0(x)
代码语言:javascript
复制
g.variables()
(x,)
代码语言:javascript
复制
f.variables()
(y,)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69723107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档