标签: symbolic-math

在 Python 中解决符号布尔变量

我需要解决一组符号布尔表达式,例如:

>>> solve(x | y = False)
(False, False)

>>> solve(x & y = True)
(True, True)

>>> solve (x & y & z = True)
(True, True, True)

>>> solve(x ^ y = False)
((False, False), (True, True))
Run Code Online (Sandbox Code Playgroud)

此类变量的数量很大(~200),因此无法使用蛮力策略。我在网上搜索,发现SympySage具有符号操作功能(特别是thisthis可能很有用)。我怎样才能做到这一点?

编辑:我主要试图操纵这些东西:

>>> from sympy import *

>>> x=Symbol('x', bool=True)

>>> y=Symbol('y', bool=True)

>>> solve(x & y, x)
Run Code Online (Sandbox Code Playgroud)

这导致NotImplementedError. 然后我尝试 solve(x * y, x)which give [0](我不知道这是什么意思),solve(x * y …

python boolean symbolic-math sympy sage

5
推荐指数
1
解决办法
2157
查看次数

Julia 在循环中更改名称,使用符号变量

我想在循环的每次迭代中更改符号变量的名称,然后使用这些符号变量求解方程,例如:

using SymPy
for i in 1:5
  p{i} = symbols("p"{i}, real=true,positive=true)
  solve(p{i}^2-i^2)
end
Run Code Online (Sandbox Code Playgroud)

因此,我希望创建一系列标量符号变量(因为我认为不可能创建向量值符号变量),每个变量都具有不同的名称 - p1、p2、p3、p4 和 p5 - 然后使用这些在方程求解器中。然而,花括号符号似乎不适用于按照 matlab 在 julia 中命名。快速谷歌没有提出任何明显的答案。有任何想法吗?

symbolic-math sympy julia

5
推荐指数
1
解决办法
1080
查看次数

用MATLAB分解复杂系统

以复杂的符号形式考虑以下系统:

% syms ix %// or
% syms x  %//?
sys(ix) = ((10+(ix)))/((20+5(ix)+(10(ix))^2+(ix)^3))
Run Code Online (Sandbox Code Playgroud)

哪里

ix = imaginary part
Run Code Online (Sandbox Code Playgroud)

MATLAB可以象征性地计算imag(sys(jx))real(sys(jx))

math matlab symbolic-math

5
推荐指数
1
解决办法
34
查看次数

sympy laurent多项式因子

我想这一定有一个简单的答案,但我搜索了很长时间,没有找到。

例子:一个简单的洛朗多项式,所以

>> p = 2*y*x**2+4*y/x

分解给出

>> factor(p) 2*y*(x**3 + 2)/x 我如何提取因子2*y/x?当表达式不是多项式时,是否有一种简单的方法来获得表达式中的公因数?我尝试了很多,但没有发现任何令人满意的东西。分解一定存在于 的步骤中factor(),对吗?

symbolic-math sympy

5
推荐指数
1
解决办法
205
查看次数

如何将 gplearn 的输出导出为 sympy 表达式或其他一些可读格式?

尽管这听起来像是一项简单的任务,但我还没有通过文档遇到过这样做的方法。

运行任意例程后(例如这些示例之一,我得到类似

>>> print(est_gp)
sqrt(div(add(1.000, sub(div(sqrt(log(0.978)), X0), mul(-0.993, X0))),add(-0.583, 0.592)))
Run Code Online (Sandbox Code Playgroud)

我如何(或者我什至可以)将其转换为可以在外部使用gplearnsympy表达式,例如表达式?

python machine-learning symbolic-math sympy gplearn

5
推荐指数
2
解决办法
703
查看次数

如何在 sympy 中对向量求导?

我想知道是否可以sympy使用向量表示法求多项式和表达式的导数。例如,如果我有一个表达式作为两个坐标 x1 和 x2 的函数,我可以只调用一次diff(x),其中是和x的向量,还是需要对和进行两次单独的调用,并将它们堆叠在一个矩阵?x1x2diffx1x2

这说明了什么是有效的,以及什么是我想要的理想工作:

import sympy
from sympy.matrices import Matrix

# I understand that this is possible: 
x1 = sympy.symbol.symbols('x1')  
x2 = sympy.symbol.symbols('x2')

expr_1 = x1**2+x2
poly_1 = sympy.poly(expr_1, x1, x2)

print Matrix([[poly_1.diff(x1)],[poly_1.diff(x2)]])

# but is something like this also possible?
x1 = sympy.symbol.symbols('x1')  
x2 = sympy.symbol.symbols('x2')
x_vec = Matrix([[x1],[x2]])

expr_1 = x1**2+x2
poly_1 = sympy.poly(expr_1, x1, x2)

# taking derivative with respect to a vector
poly_1.diff(x_vec) …
Run Code Online (Sandbox Code Playgroud)

python symbolic-math sympy python-2.7

5
推荐指数
1
解决办法
2653
查看次数

Sympy - 当表达式包含许多符号时,积分速度很慢

假设我有以下表达式,我想对z从 0 到 的变量进行积分L

import sympy as sp

mdot, D, R, alpha, beta, xi, mu0, q, cp, Tin, L = sp.symbols("\dot{m}, D, R, alpha, beta, xi, mu_0, q, c_p, T_in, L", real=True, positive=True, constant=True)
z = sp.symbols("z", real=True, positive=True)
n = sp.Symbol("n", real=True)

firstexpr = 8 * mdot**2 * R / (sp.pi**2 * D**5) * (alpha + beta * (sp.pi * D * mu0 / (4 * mdot))**xi * (q * z / (mdot * cp) …
Run Code Online (Sandbox Code Playgroud)

python symbolic-math sympy

5
推荐指数
0
解决办法
332
查看次数

有界 sympy 符号变量

我想通过将其转换为非线性方程组并使用 sympy 的“solve”函数求解来解决多元优化问题,如下所示:

xopt = sympy.solve(gradf, x, set=True)
Run Code Online (Sandbox Code Playgroud)

问题是,这个特定的方程有无限组解,调用求解只会冻结我的计算机。

如果我可以为我的符号变量设置下限和上限,即引入一组约束:

l1 <= x1 <= u1, l2 <= x2 <= u2, ..., ln <= xn <= un

...我可以将解决方案集限制为有限的一个,但我很难找到如何使用 sympy 的 API 来做到这一点。有人可以帮忙吗?

python optimization symbolic-math sympy python-3.x

5
推荐指数
0
解决办法
435
查看次数

简化表达式树

我正在尝试编写一个简化数学表达式的程序。

我已经编写了一个将字符串转换为二叉树的解析器。例如 (1+2)*x 将变为

    *
   / \
  +   x
 / \
1   2
Run Code Online (Sandbox Code Playgroud)

我简化此类树的想法如下:您存储一组树及其简化版本例如

    *                       +
   / \                     / \
  a   +        and        *   *
     / \                 / \ / \
    b   c               a  b a  c
Run Code Online (Sandbox Code Playgroud)

(其中 a、b、c 可以是任何子树)然后,如果我找到与存储的树之一匹配的子树,我将用其简化版本替换它。

如果有必要,我会重复这个过程,直到树完全简化。

这种方法的问题在于,在某些情况下它无法“组合同类项”。例如,如果我尝试存储树:

      +                *
     / \      and     / \
    x   x            2   x
Run Code Online (Sandbox Code Playgroud)

然后,当我尝试使用以下树简化表达式 x+y+x 时:

    +
   / \
  x   +
     / \
    y   x  
Run Code Online (Sandbox Code Playgroud)

不会简化为2x+y,因为子树

      +     
     / \     
    x   x      
Run Code Online (Sandbox Code Playgroud)

不包含在树中,因此树不会被简化。

我尝试编写一个显式算法来组合类似的项,但需要考虑的情况太多。

谁能帮我找到解决这个问题的方法吗?

algorithm algebra symbolic-math

5
推荐指数
1
解决办法
1026
查看次数

用 R 转换抽象语法树

例如,给定一个算术表达式,x + y*z我想将其转换为add(x, multiply(y, z)).

在这里发现了一个有用的功能

> getAST <- function(ee) purrr::map_if(as.list(ee), is.call, getAST)
> getAST(quote(x + y*z)) 
[[1]]
`+`

[[2]]
x

[[3]]
[[3]][[1]]
`*`

[[3]][[2]]
y

[[3]][[3]]
z
Run Code Online (Sandbox Code Playgroud)

可以使用它rapply(result, as.character, how = "list")来获取字符而不是符号。

如何从这个 AST 中得到add(x, multiply(y, z))(结果)?当有一些括号时,这会变得更加复杂:

> getAST(quote((x + y) * z)) 
[[1]]
`*`

[[2]]
[[2]][[1]]
`(`

[[2]][[2]]
[[2]][[2]][[1]]
`+`

[[2]][[2]][[2]]
x

[[2]][[2]][[3]]
y



[[3]]
z
Run Code Online (Sandbox Code Playgroud)

我不要求答案必须使用该getAST功能。这只是一种可行的方法。

当然,在我的实际用例中,表达式更长。


这是没有括号时的情况的解决方案(我认为):

getAST <- function(ee) purrr::map_if(as.list(ee), is.call, getAST)

ast …
Run Code Online (Sandbox Code Playgroud)

r arithmetic-expressions symbolic-math abstract-syntax-tree

5
推荐指数
1
解决办法
86
查看次数