Sympy autowrap (cython):为 sympy.Max、sympy.Heaviside 定义“助手”

2024-05-05

我有一个 sympy.Matrix,称为 J_sym,我想自动包装它(最好使用 cython 后端);相应的符号存储在列表list_args中。

然而,我遇到的问题是显然不支持某些 sympy 函数,在我的例子中特别是 sympy.Max 和 sympy.Heaviside。

具体来说,如果我尝试

J_num_autowrap = autowrap(J_sym, backend="cython", args=list_args)

我得到以下信息:

[...]
wrapped_code_10.c(4): warning C4013: 'Heaviside' undefined; assuming extern returning int
wrapped_code_10.c(4): warning C4013: 'Max' undefined; assuming extern returning int
[...]
: fatal error LNK1120: 2 unresolved externals
[...]
failed with exit status 1120

(当仅使用 numpy 进行羔羊化时,会出现类似的问题;但人们可以轻松地为这些函数传递字典。)

现在,似乎 autowrap 的“helpers”参数应该提供一个解决方案;但是,我不知道如何正确使用它。文档字符串本身绝对是神秘的,我只找到了这个带有示例的链接:
https://github.com/sympy/sympy/issues/10572 https://github.com/sympy/sympy/issues/10572

我不确定如何在这里正确使用助手 - 有人可以帮忙吗?

如果我尝试这样做:

J_num_autowrap = autowrap(J_sym, backend="cython", args=list_args, helpers=("Max", max(x,y), [x,y]))

如果未声明 x, y,我会收到 (a) 错误 - 如何使用自由变量执行此操作? (b) 如果我在将 x 和 y 声明为 sympy 符号后执行相同操作,我只会收到错误“无法确定关系的真值”。

(上面的链接提到无论如何都不可能传递多个帮助器 - 尽管在我看来这将在 1.0 中修复。我仍然收到“ValueError:没有足够的值来解压(预期为 3,得到了 2) )”当尝试传递 2 个(乱码)辅助元组时。不确定状态 - 也许我只是运气不好)。

如果有任何替代方法可以从我的矩阵生成 C 代码,我也将不胜感激这方面的任何提示。


作为 Max 问题的解决方法,您可以使用

helpers=("Max", (abs(x+y) + abs(x-y))/2, [x, y])

表达方式(abs(x+y) + abs(x-y))/2在数学上等价于max(x, y)并且不会引起任何投诉autowrap。一个完整的例子:

from sympy import *
from sympy.utilities.autowrap import autowrap
x, y = symbols('x y')
f = autowrap(Max(2*x, y+1), args=[x, y], backend="cython", helpers=("Max", (abs(x+y) + abs(x-y))/2, [x, y]))
print([f(5, 6), f(1, 2)])    # outputs 10 and 3 

相似地,Heaviside(x)是相同的(x + abs(x))/(2*x)-- 但当 x=0 时后一个表达式为 NaN。更丑陋但安全的版本是(x + abs(x))/(2*abs(x) + 1e-300)添加 1e-300 几乎不会改变结果。

多个助手的问题

您需要帮手both马克斯和赫维赛德。这就是你点击的地方开放问题 https://github.com/sympy/sympy/issues/10572:autowrap 中存在一个错误,导致无法使用多个助手。文档 http://docs.sympy.org/latest/modules/utilities/autowrap.html#sympy.utilities.autowrap.autowrap建议格式如下

helpers=[("Max", ..., [x, y]), ("Heaviside", ..., [x])]

But 在这条线上 https://github.com/sympy/sympy/blob/master/sympy/utilities/autowrap.py#L506autowrap 所做的事情对于一个助手来说很方便(我们不必将其放入列表中),但对于多个助手来说是致命的(额外的一层包装):

helpers = [helpers] if helpers else ()

自然,接下来的拆包for name_h, expr_h, args_h in helpers fails.

多个助手的解决方法

The ufuncify把手helpers论证正确。很遗憾,ufuncify最终打电话autowrap对于除 NumPy 之外的所有后端,因此错误仍然发生在 autowrap 中。但如果你愿意使用 NumPy 后端,这是一个解决方案:

from sympy.utilities.autowrap import ufuncify
x, y = symbols('x y', real=True)
my_helpers = [("Max", abs(x+y)/2 + abs(x-y)/2, [x, y]), ("Heaviside", (x + abs(x)) / (2*abs(x) + 1e-300), [x])]
f = ufuncify([x,y], Max(2*x, y+1) + Heaviside(x-4), backend="numpy", helpers=my_helpers)
print([f(5, 6), f(1, 2)])   $ outputs 11  and  3

减少到一名助手

如果您可以更改表达式以消除 Max 和 Heaviside 之一(甚至两者),则可以使用 Cython 后端。例如,也许您只需要 Max(x, 0),因此您定义了一个 Python 函数“正部分”:

pos = lambda x: (x+abs(x))/2

那么autowrap就没有问题了pos,你只需要帮助Heaviside:

f = autowrap(pos(9-x-y) + Heaviside(x-4), args = [x, y], backend = "cython", helpers=("Heaviside", (x + abs(x)) / (2*abs(x) + 1e-300), [x]))
print([f(5, 6), f(1, 2)])   #  outputs 1 and 6

这种替换的实用性取决于您的符号表达式是如何获得的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sympy autowrap (cython):为 sympy.Max、sympy.Heaviside 定义“助手” 的相关文章

  • SymPy 相当于 mathematica 中的 HoldForm

    在 Mathematica 中 可以阻止系统在输入表达式时简化表达式 语法如下 HoldForm x x 是否可以用 SymPy 做类似的事情 以下方法可以达到类似的效果 可能还有其他我不知道的可用 import sympy as sp x
  • 如何在 SymPy 中创建一个参数本身就是随机变量的随机变量?

    我有一个随机变量 Y 其分布为泊松分布 参数本身就是随机变量 X 其分布为泊松分布 参数为 10 如何使用 SymPy 自动计算 X 和 Y 之间的协方差 代码 from sympy stats import x1 Poisson x1 3
  • 在 Sympy.mpmath.plot 中更改图形大小

    我希望这个问题不是太初级 我已经广泛搜索了解决方案 但尚未找到 我最近开始使用 Jupyter Notebook 和 Sympy 在微积分 II 课上做笔记和做作业 这真是一个巨大的好处 然而 我唯一的问题是我无法弄清楚如何配置绘图的大小
  • 在系数之间添加乘号 (*)

    我有一个程序 用户在其中输入一个函数 例如sin x 1 我在用着ast尝试通过将组件列入白名单来确定字符串是否 安全 如下所示这个答案 https stackoverflow com a 11952618 4414003 现在我想解析字符
  • 如何解析和简化像“3cm/μs² + 4e-4 sqmiles/km/h**2”这样的字符串,正确处理物理单位?

    我想像这样分割一个字符串3cm s 4e 4 sqmiles km h 2进入其SI unit https en wikipedia org wiki International System of Units 在这种情况下 m s 2 及
  • 是否有一个完整的示例来将 sympy 中的数学表达式写入 Microsoft Word 文档?

    这可能是一个愚蠢的问题 但我很绝望 我是一名数学老师 我尝试生成数学测试 我为此尝试了 Python 并完成了一些工作 然而 我不是一个专业的程序员 所以我对 MathMl prettyprint 之类的东西迷失了方向 有谁可以为我提供一个
  • 使用 Sympy 集成到 Python 中

    我目前正在使用Sympy帮助我进行数学计算 现在 我正在尝试执行数值积分 但每次运行脚本时都会出现错误 这是脚本 from sympy import cst qe 1 60217646 10 19 m0 N 1 25663706 10 6
  • sympy 中的复数:解析欧拉恒等式

    我正在使用 sympy python 3 中的复杂函数 但无法让 sympy 简化方程 特别是我无法使用欧拉恒等式将复指数分解为实部和虚部 这是我的代码 import sympy as sym from sympy import I ini
  • 使用 sympy 计算多元函数的泰勒级数

    我正在尝试使用 SymPy 计算依赖于三角函数的函数的泰勒级数sinc here http docs sympy org dev modules mpmath functions trigonometric html sinc functi
  • 用 sympy 反转排列

    在什么功能sympy combinatorics permutations可以返回给定排列的逆排列吗 在 Google 中搜索不会给出结果 我可以写这个函数 但是如果这个函数已经实现了sympy 这将是不必要的 谢谢你的帮助 您正在寻找 I
  • 有没有办法在 SymPy 中处理常量函数参数?

    我正在生成符号函数并使用 SymPy 来简化它们 现在我想要一种方法来 简化 表示尚未拟合的函数中的常量参数的符号 例如 如果我生成一个多项式 我可能会生成一个像这样的字符串 C x x C x C x C SymPy 会变成 C x 2
  • 如何查找函数所有 **args 的列表?

    我怎样才能找到所有的列表 args一个函数的 例如 我知道symbols take positive True real True等作为参数 我想查看这些可能参数的完整列表 但是 它们没有列在 Sympy Core 中doc page ht
  • 如何使符号计算中的所有低值都变为零?

    如何将 SymPy 表达式中的所有低值设为零 例如我的结果是 1 0 a1 cos q1 6 12e 17 a2 sin q2 a3 sin q2 q3 a4 sin q2 q3 q4 sin q1 1 0 a2 cos q2 a3 cos
  • sympy 将分数与变量分开

    使用 sympy 如何将分数与变量分开 Mul Fraction 3 5 Pow K Integer 2 2 3 K 5 to 3 2 K 5 我知道这个简化版本还不错 但是当我有很大的方程时 它会变得混乱 我不太熟悉漂亮的打印或 LaTe
  • SYMPY:特征向量计算后如何细化整个矩阵?

    我想使用 sympy 来计算特征向量 我用 jupyter 笔记本做了一些试验 from sympy import a b symbols a b real True M Matrix a b b a T D M diagonalize n
  • 运行 sympy 中表达式的 AST

    我正在使用 sympy 来计算复杂函数表达式的一些高阶导数 我想遍历表达式的 AST 例如首先深度遍历节点 我怎么做 一个简单的深度优先旅行将是这样的 from sympy import pi sin from sympy abc impo
  • 用任意参数替换 sympy 函数

    这应该是一项简单的任务 但我很难让它在 Sympy 中工作 我想用特定公式替换带有任意参数的未定义函数 例如 from sympy import var a b c f Function f test f a b lin test subs
  • 如何让 SymPy 收集偏导数?

    我一直在使用 SymPy 来扩展复杂偏微分方程的项 并希望使用 Collect 函数来收集项 然而 在处理微分变量不同的二阶 或高阶 导数时似乎存在问题 在下面的代码示例中collect expr6 有效 但是collect expr7 没
  • sympy 中共轭的导数

    当我尝试用 SymPy 区分符号时 我得到以下结果 In x Symbol x In diff x x Out 1 当我将符号与其共轭微分时 结果是 In 55 diff x x conjugate Out 55 0 但是 当我尝试区分符号
  • 如何使用 SymPy 求给定一阶导数的 n 阶导数?

    Given some f and the differential equation x t f x t how do I compute x n t in terms of x t For example given f x t sin

随机推荐

  • Pathogen 不加载插件

    病原体对我不起作用 我正在遵循 Adam Lowe 发布的提示here http www adamlowe me 2009 12 vim destroys all other rails editors html 还有更多 没有任何成功 我
  • NoneType 对象不可下标

    我正在 Learnstreet 上进行一个七段显示项目 所需方法之一获取从标记为 inputString 的文本框获得的输入 然后使用将输入字符串传递给给定方法text这是一个字符串 该方法的进一步描述如下 在这个方法中 我们从输入字符串中
  • 如何在 F# 中将对象转换为泛型类型列表

    在下面的代码片段中 我的目的是将 System Object 可能是 FSharpList 转换为它所持有的任何泛型类型的列表 match o with list lt gt gt addChildList o gt list lt gt
  • 为什么 Dart 中的原生包装函数与非常轻量级的“DEFINE NATIVE ENTRY”函数相比如此重量级?

    我不明白 为什么要这样保证 这是自定义本机函数的包装器dart runtime vm native entry cc 它适用于想要编写的 Dart 程序员native extensions void NativeEntry NativeCa
  • Android 在连接 Socket 时出现错误

    在阅读了一些express io文档并成功连接到之后 我尝试使用nodejs和express io编写简单的应用程序http chat socket io在命令行中运行下面的代码并打开后 我找到了使用 nodejs 和express io
  • 将区间映射到更小的区间的算法

    我尝试搜索 但由于问题的性质 我无法找到满意的内容 我的问题如下 我试图将 0 到 2000 范围内的数字 尽管理想情况下上限是可调的 映射到 10 到 100 范围内的更小的区间 上限将映射 2000 gt 100 和下限也是如此 除此之
  • WPF 图像控件源绑定

    我是 WPF 和 C 的新手 我尝试实现以下功能 但在多次尝试后失败了 谁能帮我吗 我有一个图像控件
  • Amazon EC2 - Apache 服务器重启问题

    当我运行这个命令时 sudo etc init d httpd restart 它给出以下错误 停止 httpd 失败 启动 httpd 98 地址已在使用中 make sock 无法绑定到地址 80 98 地址已在使用 make sock
  • MVC 4 使用 Bootstrap 编辑模态表单

    我正在使用 MVC 4 和实体框架来开发 Intranet Web 应用程序 我有一个可以通过编辑操作进行修改的人员列表 我想通过使用模态表单使我的应用程序更加动态 所以我尝试将我的编辑视图放入我的 Bootstrap 模式中 我有两个问题
  • 将 nHibernate 3.x 与 Jet 驱动程序结合使用 (Microsoft Access)

    我正在开发一个 nHibernate 项目 该项目使用 Access 数据库作为数据源 不幸的是 我在运行时遇到问题 因为我找不到支持 nHibernate 3 x 的 Jet 驱动程序 我已经从 trunk 下载了源代码并编译了它 但事实
  • JAGS 中的柯西先验

    我正在使用 rJAGS 构建多级贝叶斯模型 并且我想为我的几个参数指定柯西先验 有没有办法在 JAGS 中做到这一点 或者我需要切换到 STAN 吗 我的 JAGS 模型如下 我想更换dnorm柯西分布 但 JAGS 找不到标准R柯西分布
  • 按属性值选择 XML 节点

  • Haxe 摘要 - 使用 @:from 时可以隐式转换数组吗?

    我试图将一种类型的数组视为另一种 抽象 类型的数组 当我使用抽象的基础类型时 它工作得很好 但是当我尝试使用另一种类型 使用定义的 from关键字 我构建失败 如果我使用显式的 它会起作用cast 但我想知道 有什么办法可以解决这个问题 我
  • 以编程方式创建 UILabel

    我通过代码执行了以下操作 UILabel label UILabel alloc initWithFrame CGRectMake 40 70 300 50 label backgroundColor UIColor clearColor
  • 比较周期性数据的快速方法

    假设我有任意类型的数据集 A B C D 并且我想将其与另一个数据集进行比较 我希望 A B C D B C D A C D A B 和 D A B C 的比较成立 但是不适用于 A C B D 或任何其他未类似排序的集合 有什么快速方法可
  • 在 Drupal 8 中如何在保存节点之前操作值?

    我有一个编辑节点表单 当用户输入新值并单击提交来编辑节点时 我首先想取回旧节点 操作该值 然后保存 更新节点 以下是我的解决方案 但它不起作用 function custom module form node form alter form
  • C 中有数组大小/长度的快捷方式吗?

    有什么方法可以加快 C 中获取数组大小的速度吗 打字sizeof array sizeof int 每次都会变老 有没有 C 库有类似的东西 length或者有什么方法我可以定义sizeof array sizeof int 作为某种较短的
  • Visual Studio 模板 - 添加其他预先存在的项目

    我正在开发一个 Visual Studio 模板 其中生成的项目依赖于许多引用 这些引用恰好是源代码控制下的其他项目 问题是如何在我的 ProjectGroup 模板中进行设置 例如 如果我在 C Stuff MyUtilityProjec
  • Javascript .includes 函数无法与对象数组一起正常工作[重复]

    这个问题在这里已经有答案了 我有一个正在使用的对象数组 includes 功能 我正在使用数组中的对象搜索该数组 对象是相同的 但似乎没有匹配项 我已将问题复制到这把小提琴 https jsfiddle net 6dua0u0n 代码也在下
  • Sympy autowrap (cython):为 sympy.Max、sympy.Heaviside 定义“助手”

    我有一个 sympy Matrix 称为 J sym 我想自动包装它 最好使用 cython 后端 相应的符号存储在列表list args中 然而 我遇到的问题是显然不支持某些 sympy 函数 在我的例子中特别是 sympy Max 和