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

2024-05-19 16:26:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我在下面的代码中定义了两个方程式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包?也许是一个更有效的替代解算器?我希望我不必求助于数值解。你知道吗


Tags: 代码import定义spf2f1aa算器
1条回答
网友
1楼 · 发布于 2024-05-19 16:26:27

如果你用f1来解b,然后把它代入f2,你得到一个表达式,这个表达式的分子在bb中是立方的,没有因子。解一个符号立方不会很快。你所能做的最好的事情就是确定系数并将它们代入三次方程的通解中。你知道吗

>>> gen = Tuple(*solve(A*x**3+B*x**2+C*x+D,x))
>>> bbexpr = f2.subs(b, solve(f1, b)[0])
>>> n = bbexpr.as_numer_denom()[0].expand()

然后对于每个系数,类似这样的(对于第一个系数):

>>> eA = n.coeff(bb**3)
>>> gen = gen.subs(A, eA)

剧透警报:这将是笨拙的。你知道吗

相关问题 更多 >