我有三个真实的多变量方程(三个变量)需要同时求解,以获得数值结果(在本例中不是符号结果)。在过去,我只是使用SymPy的solve()函数,它对我所处理的大部分问题(线性符号方程)都很有效。
但这三个表达式都是非线性的,假设有三个符号表达式e1、e2和e3,其中变量c1、c2和c3为真实的正变量:
c1, c2, c3 = symbols( 'c1,c2,c3', real=True, positive=True )
e1 = f(c1, c2, c3) # f() is actually too long to write out
e2 = g(c1, c2, c3) # g() is actually too long to write out
e3 = h(c1, c2, c3) # h() is actually too long to write out
# .. but see at-bottom for f() for clarity
字符串
我在尝试以下操作时没有得到任何错误:
solve( [ Eq(e1, -1), Eq(e2, -0.5), Eq(e3, -sqrt(3)/2) ], [ c1, c2, c3 ] )
型
我碰巧知道正确答案的附近:c1=3.5472,c2=1.39199,c3=0.20238(大致)。
然而,我在等待了几个小时后终止了解决方案的尝试。
我不知道如何用附近的值“帮助”上面的求解器。(我是一个临时用户,因此可能足够无知,不知道如何找到正确的文档,如果存在的话。我确实尝试过,并考虑在那里花了几个小时后才寻求帮助。我不会在这里记录所有失败的尝试。)
所以我决定,如果我将上述方程简化,那么也许我可以利用其他求解器。
我的第一个倾向是建立一个简化的功能,导致零,因为我想象的可能性减少了一组选项,否则。所以,如下所示:
f1 = lambdify( (c1,c2,c3), e1 + 1 )
f2 = lambdify( (c1,c2,c3), e2 + 0.5 )
f3 = lambdify( (c1,c2,c3), e3 + sqrt(3)/2 )
型
当我插入c1、c2和c3的近似值时,我确实从f1、f2和f3得到了接近于零的输出。这很好。这意味着我至少成功地(第一次)以一种我预期的方式使用了cardify。
然而,现在我被困在从这里走哪条路上。
我确实有很多失败的结果可以记录下来。但是,回头看,它们完全是因为我的无知,在这里可能没有特别的帮助。噪音和信号很少,我想。
有且只有一个可能的解,所有三个解将同时收敛于零,所以这不是一个完全的模拟退火问题我完全期望SymPy的solve()能很快地处理这个问题,但现在我怀疑它是在旋转它的轮子进行符号导数。(当然,我不确定)但这就是为什么我在考虑将这些表达式移植到更多的数值方面,希望有一个求解器,可以处理数值差异,而不是符号导数。
正确的方法是什么?我不知道。我认为答案应该是我学习一些新的语法,我现在还缺乏。但是请记住,e1,e2和e3不是c1,c2和c3的线性组合。它们涉及各种整数幂,平方根,立方根,以及其中任何两个或三个的各种乘积的组合。
就是这样。我希望在正确的方向上有一个推动,如果不是一个直截了当的“这就是如何”的答案。
**注意:**e1,e2和e3在下面单独的行上,供任何关心这些东西看起来像什么的人使用:
-(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))/(3*(sqrt(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2 + 27/(2*c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(2*c1**2*c2**2*c3**2) + (2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**(1/3)) - (sqrt(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2 + 27/(2*c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(2*c1**2*c2**2*c3**2) + (2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**(1/3)/3 - (2*c1*c3 + 2*c2*c3)/(3*c1*c2*c3)
((c2 + 3*c3)/(c1*c2*c3) - (2*c1*c3 + 2*c2*c3)**2/(3*c1**2*c2**2*c3**2))*re(1/((-1/2 + sqrt(3)*I/2)*(sqrt(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2 + 27/(2*c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(2*c1**2*c2**2*c3**2) + (2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**(1/3))) + sqrt(3)*((cos(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)*sqrt(Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2))/2 + 27/(2*c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(2*c1**2*c2**2*c3**2) + (2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2 + sin(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)**2*Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/4)**(1/6)*sin(atan2(sin(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)*sqrt(Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2))/2, cos(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)*sqrt(Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2))/2 + 27/(2*c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(2*c1**2*c2**2*c3**2) + (2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))/3)/6 + ((cos(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)*sqrt(Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2))/2 + 27/(2*c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(2*c1**2*c2**2*c3**2) + (2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2 + sin(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)**2*Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/4)**(1/6)*cos(atan2(sin(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)*sqrt(Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2))/2, cos(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)*sqrt(Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2))/2 + 27/(2*c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(2*c1**2*c2**2*c3**2) + (2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))/3)/6 - (2*c1*c3 + 2*c2*c3)/(3*c1*c2*c3)
((c2 + 3*c3)/(c1*c2*c3) - (2*c1*c3 + 2*c2*c3)**2/(3*c1**2*c2**2*c3**2))*im(1/((-1/2 + sqrt(3)*I/2)*(sqrt(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2 + 27/(2*c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(2*c1**2*c2**2*c3**2) + (2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**(1/3))) + ((cos(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)*sqrt(Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2))/2 + 27/(2*c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(2*c1**2*c2**2*c3**2) + (2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2 + sin(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)**2*Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/4)**(1/6)*sin(atan2(sin(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)*sqrt(Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2))/2, cos(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)*sqrt(Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2))/2 + 27/(2*c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(2*c1**2*c2**2*c3**2) + (2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))/3)/6 - sqrt(3)*((cos(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)*sqrt(Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2))/2 + 27/(2*c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(2*c1**2*c2**2*c3**2) + (2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2 + sin(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)**2*Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/4)**(1/6)*cos(atan2(sin(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)*sqrt(Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2))/2, cos(atan2(0, -4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2)/2)*sqrt(Abs(-4*(-3*(c2 + 3*c3)/(c1*c2*c3) + (2*c1*c3 + 2*c2*c3)**2/(c1**2*c2**2*c3**2))**3 + (27/(c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(c1**2*c2**2*c3**2) + 2*(2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))**2))/2 + 27/(2*c1*c2*c3) - 9*(c2 + 3*c3)*(2*c1*c3 + 2*c2*c3)/(2*c1**2*c2**2*c3**2) + (2*c1*c3 + 2*c2*c3)**3/(c1**3*c2**3*c3**3))/3)/6
型
1条答案
按热度按时间chy5wohz1#
Sympy还公开了
nsolve
,它可以用来数值求解线性(或非线性)方程组。你所要做的就是:字符串
这个函数使用mpmath的
findroot
来简化表达式,如果你碰巧知道一个很好的初始猜测,这是非常方便的。因为你有3个方程,你也可以使用SymPy Plotting Backend的
plot3d_implicit
来找到一个好的初始猜测:型
无论如何,在不知道
e2, e3
的确切表达式的情况下,这就是我所能建议的。