给定方程 |x - 5| + |y| = 5,如何使用 SymPy 解决它?
如果我使用solve()和Abs()的组合,它会给我这个错误
当参数不是实数或虚数时求解 Abs(x - 5)
但是,在会议开始时我写下了
x, y, z = symbols('x, y, z', RealNumber = True)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
谢谢!
python equation sympy computer-algebra-systems equation-solving
我正在寻找C++开源库(或者只是开源的Unix工具):方程式上的等式测试.
方程式可以在运行时期间构建为AST树,字符串或其他格式.
方程式主要是简单的代数方程式,对未知函数有一些假设.域,将是整数算术(没有浮点问题,因为相关问题是众所周知的 - 感谢@hardmath强调它,我认为它是已知的).
示例:输入可能包含函数phi
,有关于它的假设(大多数情况)phi(x,y)=phi(y,x)
并尝试解决:
equality_test( phi( (a+1)*(a+1) , a+b ) = phi( b+a, a*a + 2a + 1 )
它可以是模糊的或任何相等的测试 - 我的意思是,它不必总是成功(即使方程式相等,它也可能返回"假").
如果支持关于phi
函数的上述假设存在问题,我可以处理这个,所以也欢迎简单的线性代数方程等式测试器.
PS如果这样的equality_test可以(在成功的情况下)返回同构 - (我的意思是,一种"映射") - 在两个给定的方程之间,将非常受欢迎.但是,没有这种功能的工具也非常受欢迎.
PS通过"模糊测试器"我的意思是内部方程求解器在寻找两个函数的"同构"方面将是"模糊的",而不是在对随机输入的测试方面 - 我可以实现这一点,当然,但我尝试找到更精确的东西.
PPS还有另一个问题,为什么我需要更好的性能解决方案,而不是暴力"所有输入测试".上面的公式是我的内部问题的simplyfied形式,在这里我没有在方程的变量之间的映射.也就是说,我有eq1=phi( (a+1)*(a+1) , a+b )
和eq2=phi( l+k, k*k + 2k + 1 )
,和我必须找出a==k
和b==l
.但是这个子问题我可以用"暴力"方法处理(甚至这种方法的渐近复杂性),只有几个变量,让它为8.所以我需要为每个可能的映射做这个equation_test.如果有一个工具可以完成整个工作,我会非常感激,并且可以为这样的项目做出贡献.但我不需要这样的功能,只需通过equation_test()即可,我可以轻松处理休息.
把它们加起来:
c++ math open-source discrete-mathematics computer-algebra-systems
我正在寻找一个库或计算机代数系统,它将帮助计算环中多项式的运算
F_2[x_1, ..., x_n] / <f^2 - f>
Run Code Online (Sandbox Code Playgroud)
其中F_2
是2-元素的有限域,并且<f^2 - f>
是从元件所产生的理想f^2 - f
对所有f
在F_2[...]
.(我认为/希望/我很确定这是使用xor作为+和*[ 维基百科 ] 的布尔代数环).
例如,
x_1 = poly_xn 1
x_2 = poly_xn 2
x_1 * x_2 * x_1 -- returns "x_1 * x_2"
x_1 + x_1 + x_2 -- returns "x_2"
Run Code Online (Sandbox Code Playgroud)
我已经在Haskell中为此编写了代码,但不幸的是性能不是很好.
注意:标题"仿射k-代数"来自艾森伯德的交换代数,其中包含代数几何的观点.35; 如果有更好的名字请编辑问题,谢谢!
的象征库重载算术运算符.虽然它是用C#编写的,但我可以在F#中使用它:
open Symbolism
let x = new Symbol("x")
let y = new Symbol("y")
let z = new Symbol("z")
printfn "%A" (2*x + 3 + 4*x + 5*y + z + 8*y)
Run Code Online (Sandbox Code Playgroud)
输出:
3 + 6 * x + 13 * y + z
Run Code Online (Sandbox Code Playgroud)
但是,它也会超负荷^
.这当然不适合F#.
作为解决方法的一步,我导出了一个权限的方法组:
printfn "%A" (Aux.Pow(x, 2) * x)
Run Code Online (Sandbox Code Playgroud)
输出:
x ^ 3
Run Code Online (Sandbox Code Playgroud)
如何重载**
以使用Aux.Pow
方法组?
我可以这样做:
let ( ** ) (a: MathObject) (b: MathObject) = Aux.Pow(a, b)
Run Code Online (Sandbox Code Playgroud)
这对MathObject
价值观有效:
> …
Run Code Online (Sandbox Code Playgroud) f# symbolic-math computer-algebra-systems symbolic-computation
我在这个问题中使用的方程包含指数.由于这个原因,在区分之后,除了额外的常数和其他因素之外,它们几乎没有变化.我想知道是否有可能将这些指数收回到他们所在表达式的名称中.这是一个例子:
鉴于此功能定义
f:= x -> A*exp(B/x)
Run Code Online (Sandbox Code Playgroud)
区别后,人们会得到
A*exp(B/x)*(-B/x^2)
Run Code Online (Sandbox Code Playgroud)
如果我能以某种方式将它转换为它将会很棒
f(x)*(-B/x^2)
Run Code Online (Sandbox Code Playgroud)
这可能是MuPad或任何其他CAS包吗?
我的目标是使用sympy
哪个来编写多维泰勒近似
sin(x)=x - x**3/6 + O(x**4)
.这是我到目前为止尝试的内容:
方法1
天真地,人们可以只series
为每个变量组合两次命令,遗憾的是这不起作用,如本例所示sin(x*cos(y))
:
sp.sin(x*sp.cos(y)).series(x,x0=0,n=3).series(y,x0=0,n=3)
>>> NotImplementedError: not sure of order of O(y**3) + O(x**3)
Run Code Online (Sandbox Code Playgroud)
方法2
基于这篇文章,我首先写了一个1D泰勒近似:
def taylor_approximation(expr, x, max_order):
taylor_series = expr.series(x=x, n=None)
return sum([next(taylor_series) for i in range(max_order)])
Run Code Online (Sandbox Code Playgroud)
用1D示例检查它可以正常工作
mport sympy as sp
x=sp.Symbol('x')
y=sp.Symbol('y')
taylor_approximation(sp.sin(x*sp.cos(y)),x,3)
>>> x**5*cos(y)**5/120 - x**3*cos(y)**3/6 + x*cos(y)
Run Code Online (Sandbox Code Playgroud)
不过,如果我知道这样做既扩张做一个链接调用x
和y
,sympy挂断
# this does not work
taylor_approximation(taylor_approximation(sp.sin(x*sp.cos(y)),x,3),y,3)
Run Code Online (Sandbox Code Playgroud)
有人知道如何解决这个问题或以另一种方式实现它吗?
我试图让Matlabs的MuPad像MathCad一样漂亮和方便.
假设两个变量赋值:
x_a:=2*unit::mm;
y_b:=5*unit::mm;
Run Code Online (Sandbox Code Playgroud)
我想要一个漂亮的(带有Tex的排版)输出
z = x_a + y_b = 7 mm
Run Code Online (Sandbox Code Playgroud)
我已经设法通过使用output::mathText(...)
:
output::mathText(hold(z)," = " , (z:=hold(x_a+y_b)) , " = " , z)
Run Code Online (Sandbox Code Playgroud)
看起来像所希望的:
但这不是很方便,也不易读.所以我试图将它包装成宏或函数:
evalPrint(z,x_a+y_b)
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我尝试了什么:
我写了一个程序如下:
evalPrint :=
proc(x,y) begin
output::mathText(hold(x)," = " , (x:=hold(y)) , " = " , x)
end_proc:
Run Code Online (Sandbox Code Playgroud)
但我得到了
我错过了什么?
关于霍希勒的答案:他的第一个解决方案确实不起作用,而第二个解决方案确实如此:
程序:
evalPrintVal := proc(x,y) option hold;
begin
output::mathText(x, " = ", evalassign(x,y));
end_proc:
evalPrintEq := proc(x,y) option hold;
begin
output::mathText(x, " = ", evalassign(x,y), " = …
Run Code Online (Sandbox Code Playgroud) 我正在为scala寻找一个简单的CAS系统.
它应该具有以下功能:
String
为AST如果不存在并且我必须自己写一些基本的东西,那么最好的代表是什么?
我在想这样的事情:
abstract trait Term
{
def simplify:Term
def evaluate(assignment:Var => Double):Double
def derivative:Term
}
case class Const(c:Int) extends Term
case class Var(x:String) extends Term
case class Negate(x:Term) extends Term
case class Subtract(x:Term, y:Term) extends Term
case class Divide(x:Term, y:Term) extends Term
object Add { def apply(x:Term*):Add = Add(x.toList) }
case class Add(xs : List[Term]) extends Term
object Multiply { def apply(x:Term*):Multiply = Multiply(x.toList) }
case class Multiply(xs:List[Term]) extends Term
case class Power(x:Term, …
Run Code Online (Sandbox Code Playgroud) 我有一组由计算机代数系统(CAS)产生的多项式表达式.例如,这是该集合的一个元素.
-d*d*L*L*QB*B*L*L*Q + 2*d*F*Ĵ*L*Q + 2*b*表F*H*L*QF*F*Ĵ*Ĵ*QB*b*表Ĵ*∫*q + 2*b*表d*H*Ĵ*QF*F*H*H*QD*d*H*H*q + b*b*∫*∫*○*O-2*b*d*H*Ĵ*○*O + d*d*H*H*○*0-2*b*b*∫*L*N*O + 2*b*表d*H*L*n个*O + 2*b*表F*H*Ĵ*N*0-2*d*F*H*H*N*O + 2*b*表d*∫*L*M*0-2*d*d*H*L*M*0-2*b*表F*Ĵ*∫*M*O + 2*d*F*H*Ĵ*M*O + b*b*L*L*N*N-2*b*表F*H*L*N*N + F*F*H*H*N*N-2*b*表d*L*L*m*n个+ 2*b*表F*Ĵ*L*米*N + 2*d*F*H*L*m*n个-2*F*F*H*Ĵ*m*n个+ d*d*L*L*m*m的-2*d*F*Ĵ*L*M*M + F*F*Ĵ*Ĵ*m*m的
我需要尽快在C程序中执行所有这些操作.如果你仔细研究这些公式中的任何一个,很明显我们可以优化它们的计算速度.例如,在上面粘贴的多项式中,我可以立即看到术语-d*d*l*l*q,2*d*f*j*l*q和-f*f*j*j*q,这样我就可以用-q*square(d*lf*j)替换它们的总和.我相信这里可以做很多这样的事情.我不相信(但也许我错了)任何编译器都能找到这个优化,或者更高级的优化.我试图让maxima(一个CAS)为我做这个,但没有任何结果(因为我是极限初学者,我可能错过了一个神奇的命令).所以,我的第一个问题是:我们可以使用什么工具/算法来优化多项式表达式以获得计算速度?
当优化一组共享大多数变量的多项式表达式时,事情变得更加复杂.实际上,通过表达式优化表达式可能是次优的,因为在优化之前编译器可以识别公共部分,但是如果不作为整体执行则不再存在.所以,我的第二个问题是:我们可以使用哪些工具/算法来优化一组多项式表达式以获得计算速度?
最好的祝福,
PS:这篇文章与" 计算机代数软件以及最小化一组多项式中的操作数量 "有一些相似之处,但是那一点给出的答案指向CAS程序而不是说我们如何使用它们来实现我们的目标.
algorithm optimization performance computer-algebra-systems polynomials
matlab ×2
mupad ×2
python ×2
sympy ×2
algorithm ×1
c++ ×1
cas ×1
equation ×1
f# ×1
haskell ×1
math ×1
open-source ×1
optimization ×1
performance ×1
polynomials ×1
scala ×1