加快一对非线性符号方程解速度的技巧

时间:2019-09-06 20:44:18

标签: python sympy

我在下面的代码中定义了两个方程f1(b,bb)= 0和f2(b,bb)= 0。我试图找到同时满足这两个条件的(b,bb)集合。

import sympy as sp
from sympy import symbols, simplify, factor

a, b, aa, bb, q, l, h = symbols('a b aa bb q l h')

pb = l*q+h*(1-q)
pb0 = (l*(1-l)*q+h*(1-h)*(1-q))/((1-l)*q+(1-h)*(1-q))
pb1 = (l**2*q+h**2*(1-q))/(l*q+h*(1-q))
a = b*bb/(2*b*bb*l**2 - 3*b*bb*l + b*bb - 2*b*l**2 + 2*b*l - 2*bb*l**2 + 2*bb*l + 2*l**2 - 2)
aa = 2/(l*(2*b*bb*l - b*bb - 2*b*l - 2*bb*l + 2*l + 2))

f1 = 1/pb*((1+(1-aa)/(2*aa*pb1))*q*l*b - (1-(1-aa)/(2*aa*pb1))*(1-q)*h*bb) - 1
f2 = 1/(1-pb)*(1+(1-a)/(2*a*pb0))*(q*(1-l)*b+(1-q)*(1-h)*bb) - 1

sp.solvers.solve((f1,f2), (b,bb))

求解器花费的时间过长(尚无解决方案)。

我相信上述系统是双线性的。

是否有任何技巧可以加快处理速度,即利用双线性结构的python软件包?也许更高效的替代求解器?我希望我不必求助于数值解。

1 个答案:

答案 0 :(得分:0)

如果将f1求解为b并将其代入f2,则最终得到的表达式的分子在bb中为三次方,不包含因数。解决一个符号立方并不会很快。最好的办法就是识别系数,并将其代入三次方程的一般解。

vector

然后针对每个系数,如下所示(对于第一系数):

glm::vec2 verts[3]

扰流板警报:笨拙。