我需要解决一组符号布尔表达式,例如:
>>> 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),因此无法使用蛮力策略。我在网上搜索,发现Sympy和Sage具有符号操作功能(特别是this和this可能很有用)。我怎样才能做到这一点?
编辑:我主要试图操纵这些东西:
>>> 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 …
我想在循环的每次迭代中更改符号变量的名称,然后使用这些符号变量求解方程,例如:
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 中命名。快速谷歌没有提出任何明显的答案。有任何想法吗?
以复杂的符号形式考虑以下系统:
% 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))?
我想这一定有一个简单的答案,但我搜索了很长时间,没有找到。
例子:一个简单的洛朗多项式,所以
>> p = 2*y*x**2+4*y/x
分解给出
>> factor(p)
2*y*(x**3 + 2)/x
我如何提取因子2*y/x?当表达式不是多项式时,是否有一种简单的方法来获得表达式中的公因数?我尝试了很多,但没有发现任何令人满意的东西。分解一定存在于 的步骤中factor(),对吗?
尽管这听起来像是一项简单的任务,但我还没有通过文档遇到过这样做的方法。
运行任意例程后(例如这些示例之一,我得到类似
>>> 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)
我如何(或者我什至可以)将其转换为可以在外部使用gplearn的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) 假设我有以下表达式,我想对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) 我想通过将其转换为非线性方程组并使用 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 来做到这一点。有人可以帮忙吗?
我正在尝试编写一个简化数学表达式的程序。
我已经编写了一个将字符串转换为二叉树的解析器。例如 (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)
不包含在树中,因此树不会被简化。
我尝试编写一个显式算法来组合类似的项,但需要考虑的情况太多。
谁能帮我找到解决这个问题的方法吗?
例如,给定一个算术表达式,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) symbolic-math ×10
sympy ×7
python ×5
algebra ×1
algorithm ×1
boolean ×1
gplearn ×1
julia ×1
math ×1
matlab ×1
optimization ×1
python-2.7 ×1
python-3.x ×1
r ×1
sage ×1