我试图编译一个包含 UndefinedFunction 的表达式,该表达式提供了一个实现。(或者:一个包含符号的表达式,表示对外部数值函数的调用)
有没有办法做到这一点?使用 autowrap 或 codegen 还是手动编辑生成的文件?
以下天真的示例不起作用:
import sympy as sp
import numpy as np
from sympy.abc import *
from sympy.utilities.lambdify import implemented_function
from sympy.utilities.autowrap import autowrap, ufuncify
def g_implementation(a):
"""represents some numerical function"""
return a*5
# sympy wrapper around the above function
g = implemented_function('g', g_implementation)
# some random expression using the above function
e = (x+g(a))**2+100
# try to compile said expression
f = autowrap(e, backend='cython')
# fails with "undefined reference to `g'"
编辑:
我有几个大的 Sympy 表达式
表达式是自动生成的(通过微分等)
表达式包含一些调用一些数值函数的“实现的未定义函数”(即 NOT Sympy 表达式)
必须评估某些输入的表达式的最终脚本/程序将经常被调用。这意味着评估 Sympy 中的表达式(通过 evalf)绝对不可行。即使及时编译(lambdify、autowrap、ufuncify、numba.jit)也会产生过多的开销。
基本上我想为这些表达式创建一个二进制 python 扩展,而不必在 C 中手动实现它们,我认为这太容易出错了。
操作系统是 Windows 7 64 位