问题标签 [lambdify]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
284 浏览

python - lambdified sympy 表达式返回不正确的结果

我遇到了以下问题,首先我将简要解释发生了什么:

从那里我们期望

lambdified g(x,y)返回非常接近零而不是零的东西。这是重现问题的代码。只有当我进行足够数量的log评估时它才会到达f(x)

要点:https ://gist.github.com/marekyg​​gdrasil/39a24213ebaba6293464d116821cc334

来源:

输出

0 投票
0 回答
768 浏览

numpy - 使用 lambdify 和函数评估优化运行时

我目前正在优化我的代码的运行时间,但它仍然不在我希望的时间消耗范围内。我已经到了80% 的时间都花在对我的 sympy 矩阵表达式运行lambdify() 并在执行高斯求积时评估生成的 lambda 函数上。代码的所有其他方面都得到了充分优化,因此我希望有人可以帮助我优化我的lambdifying和评估sympy表达式的代码中的实质性“瓶颈”。

该代码是在具有 Python 3.5.2 的 64 位 Windows 7 机器上编写的(下面的示例说明了代码,在 Jupyter QtConsole 上执行)和以下模块版本:

  • 同情:1.0
  • 麻木:1.11.1
  • 麻木:0.27

羔羊()

我认为 lambdify() 使用大量时间的原因是 sympy 表达式的复杂性(这涉及 sympy Piecewise() 表达式的乘法)。这些表达式的简化是不可能的,因为它们是使用标准 Alpert 算法从勒让德缩放函数创建的小波函数。这里给出了一个这样的矩阵和时间比较的小例子,它与“更简单”的矩阵进行了比较:

时间比较产生:

这表明更复杂的表达式的处理速度比更简单的 Matrix 慢了近 10 倍,当将 lambdify() 应用于其中几种类型的矩阵时,这对运行时做出了重大贡献。研究我在 sympy.utilities.autowrap 中了解到更快的 ufuncify() 函数的主题,这似乎在使用 Fortran 或 C++ 后端时效果最好。但是,在我的情况下,这不是最好的选择,因为该函数尚未扩展到 sympy 矩阵,我希望代码足够通用,其他适应代码的 Windows 用户不需要安装 C++ 编译器等。 所以,有没有在不使用其他编译器的情况下为这些类型的 sympy 表达式实现lambdify() 函数的加速?

Lambda 函数评估

上述 sympy 矩阵的lambdified 函数在特定坐标处的评估时也表现不同。这通过以下简单的 5 点正交示例进行说明:

我的第一直觉是从 numba 模块中引入 jit 以加快评估速度。然而,这导致了一个弹出窗口,指出 python 已停止工作,并且内核重新启动(对于 f 和 f_simpl 都会发生):

再说一遍,是否有办法加快这些 lambda 函数评估以减少总运行时间?或者可能是某种避免 numba.jit 崩溃的方法?

0 投票
3 回答
4250 浏览

python - 我可以使用 lambdify 来评估 python 函数的导数吗?

我昨天问了一个关于区分 python 函数的问题,然后当我发现发布的答案都不能满足我评估(在某些变量中)然后绘制导数的需要时,我能够找出自己的解决方案。

以前的代码:

新代码:

如您所见,我克服了无法评估导数 fprime 的问题,方法是创建一个新函数 DerivativeOfF,它是 fprime 的“lambdified”版本。从那里,我能够评估 DerivativeOfF,并将其绘制在其中一个变量中。

我的问题是:为什么这行得通?我到底做了什么?这种方法有什么缺点?我曾尝试阅读lambdify 文档,但这让我非常困惑(我是Python 的初学者)。我的猜测是我将 Python 函数 fprime 转换为 Sympy 表达式 DerivativeOfF 或类似的东西。任何帮助解释发生的事情和原因,以及lambdify究竟做了什么(用外行的话),将不胜感激。

0 投票
1 回答
916 浏览

python - 将 sympy 表达式转换为 python 函数的 SyntaxError

我正在尝试将q_IN_w_sym(此处无法容纳的非常长的表达式)的 sympy 表达式转换为 python 函数,以便我可以评估它的数值。q_IN_w_sym我使用q_IN_w_sym.atoms(sym.Symbol)and检查了符号的数量q_IN_w_sym.free_symbols,两者都给出了相同数量的变量/符号(数量为 13)。之后,我尝试使用此答案中的建议将 sympy 表达式转换为 python 函数,如下所示:

但是,我收到以下错误:

我也尝试了以下命令,但它给出了相同的错误(虽然略有不同)

错误:

不确定上述命令有什么问题。下面,您可以找到一个最小的示例,您可以运行它来查看我面临的问题:

注意:虽然我有兴趣使用数组作为输入(r_o在本例中),但即使将其单个元素作为输入也会引发错误。另外,这里为了复现一个简单的例子,错误是不同的,但是找到数值的问题仍然存在。

0 投票
1 回答
297 浏览

python - lambdify 到 py 函数:如何保持符号的顺序不变

我有一些符号表达式已存储在文本文件中(因为它们太大),以后无法读取它们以找到它们的数值估计值。因此,在我阅读了这些表达式(比如foo_sym)之后,我将这些表达式转换为 python 函数,如下所示:

表达式中的一些符号变量是数组,因此我将函数的矢量化版本设置为:

现在,我发现向量化函数的数值估计如下:

在上面的代码中,符号值var_1, var_2, var_3, ...., var_12的顺序与我通过的符号顺序一致tuple(foo_sym.free_symbols)。但是,每次我重新启动 python 并运行上面的代码时,我都会得到一个,ValueError: math domain error因为给出的符号变量的顺序tuple(foo_sym.free_symbols)似乎已经改变了,但是值的顺序foo_fn_vec(var_1, var_2, var_3, ...., var_12)没有改变。

有没有一种方法可以在两个步骤中保持符号的顺序不变,即在转换为函数的sym.lambdify((var_1, var_2, var_3, ...., var_12), foo_sym)同时找到函数的数值为foo_num = foo_fn_vec(var_1, var_2, var_3, ...., var_12)

0 投票
2 回答
4169 浏览

python - Python - Sympy - 数值求解网格中多个参数的方程

给定方程取决于未知变量 (y) 和一组参数。给定具有参数值的网格的每个元素,我想对 y 进行数值求解。

我尝试的解决方案的简化示例如下(y 是未知变量,x 是参数):

但是,我收到以下错误:“预期为一维数值函数”。我期待为 xgrid 中的每个值 x 收到一个 y=-x**2 的向量。

请注意,实际感兴趣的函数不是示例中的 y=-x**2,而是隐含在 x in y 中的非线性函数。

我是否被迫对网格中的每个值进行循环,还是我仍然可以以某种方式使用lambdify?提前致谢!

0 投票
2 回答
389 浏览

arrays - Sympy:具有大数组输入的 Lambdify 函数

我有一个问题,需要一个大数组的函数。复制相同问题的简化代码是:

这给出了以下错误:

我想 sympy 在某些时候会使论点变平,因此会导致这个问题。

我想不出一个好的解决方法。

0 投票
1 回答
370 浏览

python - sympy lambdify 添加两个函数

我有两个用 sympy 的 lamdify 创建的函数

如何创建一个添加这两个功能的新功能?

我试过c = a + b了,但我得到了

0 投票
0 回答
47 浏览

python - Python:在lambdified sympy表达式中使用容器的优雅方式

假设我有一个包含一些数值的容器类:

我想给那些Containers 一个lambdified sympy 表达式,结果得到一个新的Container

现在我实际上不介意围绕f解包和打包值编写一些包装器,但问题出现在这里:

就像在 Numpy 中一样,我也希望它能够处理列表或与值混合的列表:

实现这一目标的优雅方法是什么?

编辑

我已经围绕 lambdify 编写了一个包装函数,它在应用 sympy 表达式之前解包值并打包结果,但它涉及检查参数的类型是 alist还是 a Container,这违背了 Python 的整个鸭子类型哲学。我的实际问题是:有没有更 Pythonic 的方式来做到这一点,不涉及丑陋的类型检查?

0 投票
1 回答
6252 浏览

python - 对多个符号变量使用 Lambdify

下面的 python 脚本计算表达式中的第一项, 4.939e-3xAxB+8.7989 at (A,B) = (1.0,1.0)

输出为:0.004939

现在下面的代码旨在实现相同的目标:

但这会返回错误: NameError: global name 'B' is not defined

有人可以解释一下吗?