如何使用 python 从复杂的非线性系统中获取所有根(复根和实根)?
How to get all roots (complex and real) from a complex non-linear system using python?
我正在尝试求解一个复杂的非线性系统。问题是有很多根,有的是复根。从这些根中,我只需要 select 实部在 [0,1] 之间且没有复数部分的那个(例如:0.23+0i)。
例如:
root1: 1.02 + 2i
root2: 0.23 + 1.23i
root3: 0.23 + 0i
...
这是我的系统:
tau1 和 tau2 是我需要找到的变量。方程式是 t1 和 t2,它们依赖于 tau1 和 tau2
x0=0 # initial position
xf=30 # final position
x1= 10;
x2 = 20;
tf=20 # final time
tau_wp=[]
def f(tau_wp):
tau1, tau2 = tau_wp
a=(1-tau1)**5*(-10*tau2**3 +15*tau2**4 -6*tau2**5) + (1-tau1)**4*(20*tau2**3 -35*tau2**4 + 15*tau2**5) + (1-tau1)**3*(-10*tau2**3 +20*tau2**4 -10*tau2**5) + (tau2-tau1)**5
b=(1-tau2)**5*(-10*tau1**3 +15*tau1**4 -6*tau1**5) + (1-tau2)**4*(20*tau1**3 -35*tau1**4 + 15*tau1**5) + (1-tau2)**3*(-10*tau1**3 +20*tau1**4 -10*tau1**5)
den=a*b -36*tau2**5*(1-tau2)**5*tau1**5*(1-tau1)**5
p2=(-6*tau1**5*(1-tau1)**5*(xf-x0)*(10*tau2**3-15*tau2**4+6*tau2**5) \
-(xf-x0)*(10*tau1**3-15*tau1**4+6*tau1**5)*a \
+ (x1-x0)*a + (x2-x0)*(6*tau1**5*(1-tau1**5)))
p1=(a*b -36*tau2**5*(1-tau2)**5*tau1**5*(1-tau1)**5)*(-(xf-x0)*(10*tau1**3-15*tau1**4+6*tau1**5) +(x1-x0)) \
+ b*( (xf-x0)*(10*tau2**3 -15*tau2**4 +6*tau2**5)*(6*tau1**5*(1-tau1)**5) \
+ (xf-x0)*(10*tau1**3 -15*tau1**4 +6*tau1**5)*a \
- (x1-x0)*a - (x2-x0)*(6*tau1**5*(1-tau1)**5))
u0=(xf-x0)*(30*tau1**2-60*tau1**3 +30*tau1**4)+p1*tf**5/120*(60*tau1**9-270*tau1**8+480*tau1**7-420*tau1**6+180*tau1**5-30*tau1**4) \
+ p2*tf**5/120 * ((1-tau2)**5*(-30*tau1**2 +60*tau1**3 -30*tau1**4) + (1-tau2)**4*(60*tau1**2 - 140*tau1**3 +75*tau1**4) + \
(1-tau2)**3*(-30*tau1**2 +80*tau1**3 - 50*tau1**4))
u1=(xf-x0)*(30*tau2**2 - 60*tau2**3 + 30*tau2**4)+p1*tf**5/120*((1-tau1)**5*(-30*tau2**2 +60*tau1**3 -30*tau1**4) + \
(1-tau1)**4*(60*tau2**2 - 140*tau2**3 +75*tau2**4) + (1-tau1)**3*(-30*tau2**2 +80*tau2**3 - 50*tau2**4) \
+ 5*tau2**4 -20*tau2**3*tau1 +30*tau2**2*tau1**2 -20*tau2*tau1**3 +5*tau1**4) \
+ p2*tf**5/120*(60*tau2**9-270*tau2**8+480*tau2**7-420*tau2**6+180*tau2**5-30*tau2**4)
## system of nonlinear equations dependent on tau1 and tau2
t1=u0*p1 ### equation 1
t2=u1*p2 ### equation 2
return [t1,t2]
我尝试使用 fsolve,但是使用 fsolve 我无法得到复杂的部分。
在 python 中有什么方法可以做到这一点吗?
非常感谢您的帮助!
这有点令人困惑,因为你说你 "couldn't get the complex part" 但在问题中你说你正在寻找虚部为 0 且实部的大小介于 0 和 1 之间的解决方案。如果这是正确的,那么 nsolve
如果你给出足够好的初始猜测就可以求解这对方程:
>>> from sympy import symbols
>>> v = symbols('tau1:3')
>>> nsolve(f(v), (tau1, tau2), (.5,.4))
Matrix([
[0.495387590772031],
[ 0.49736468918969]])
通过查看 tau1
和 tau2
的不同值的 t1
和 t2
的值,您可以大致了解在哪里寻找根。因为它们都应该为零,所以我查看了平方和的对数——越小越好:
>>> Matrix(10,10,lambda i,j:
log(sqrt(sum([k.subs(tau1,i/10).subs(tau2,j/10)**2 for k in (t1,t2)]))).round())
Matrix([
[zoo, zoo, zoo, zoo, zoo, zoo, zoo, zoo, zoo, zoo],
[-17, -5, -6, -3, -2, -2, -3, -4, -5, -7],
[ -7, -2, -1, 0, 0, 0, 0, 0, -1, -2],
[ -1, 0, 3, 4, 3, 3, 4, 4, 3, 1],
[ 3, 4, 6, 7, 6, 4, 7, 7, 6, 4],
[ 5, 6, 8, 9, 9, 5, 9, 9, 8, 6],
[ 8, 8, 10, 11, 11, 6, 11, 11, 10, 8],
[ 9, 9, 11, 12, 12, 7, 12, 12, 11, 9],
[ 9, 10, 12, 13, 13, 7, 13, 13, 12, 10],
[ 8, 11, 13, 13, 13, 7, 13, 13, 12, 10]])
(当 tau1
为零时,动物园值对应于平凡的解决方案。
我正在尝试求解一个复杂的非线性系统。问题是有很多根,有的是复根。从这些根中,我只需要 select 实部在 [0,1] 之间且没有复数部分的那个(例如:0.23+0i)。 例如:
root1: 1.02 + 2i
root2: 0.23 + 1.23i
root3: 0.23 + 0i
...
这是我的系统: tau1 和 tau2 是我需要找到的变量。方程式是 t1 和 t2,它们依赖于 tau1 和 tau2
x0=0 # initial position
xf=30 # final position
x1= 10;
x2 = 20;
tf=20 # final time
tau_wp=[]
def f(tau_wp):
tau1, tau2 = tau_wp
a=(1-tau1)**5*(-10*tau2**3 +15*tau2**4 -6*tau2**5) + (1-tau1)**4*(20*tau2**3 -35*tau2**4 + 15*tau2**5) + (1-tau1)**3*(-10*tau2**3 +20*tau2**4 -10*tau2**5) + (tau2-tau1)**5
b=(1-tau2)**5*(-10*tau1**3 +15*tau1**4 -6*tau1**5) + (1-tau2)**4*(20*tau1**3 -35*tau1**4 + 15*tau1**5) + (1-tau2)**3*(-10*tau1**3 +20*tau1**4 -10*tau1**5)
den=a*b -36*tau2**5*(1-tau2)**5*tau1**5*(1-tau1)**5
p2=(-6*tau1**5*(1-tau1)**5*(xf-x0)*(10*tau2**3-15*tau2**4+6*tau2**5) \
-(xf-x0)*(10*tau1**3-15*tau1**4+6*tau1**5)*a \
+ (x1-x0)*a + (x2-x0)*(6*tau1**5*(1-tau1**5)))
p1=(a*b -36*tau2**5*(1-tau2)**5*tau1**5*(1-tau1)**5)*(-(xf-x0)*(10*tau1**3-15*tau1**4+6*tau1**5) +(x1-x0)) \
+ b*( (xf-x0)*(10*tau2**3 -15*tau2**4 +6*tau2**5)*(6*tau1**5*(1-tau1)**5) \
+ (xf-x0)*(10*tau1**3 -15*tau1**4 +6*tau1**5)*a \
- (x1-x0)*a - (x2-x0)*(6*tau1**5*(1-tau1)**5))
u0=(xf-x0)*(30*tau1**2-60*tau1**3 +30*tau1**4)+p1*tf**5/120*(60*tau1**9-270*tau1**8+480*tau1**7-420*tau1**6+180*tau1**5-30*tau1**4) \
+ p2*tf**5/120 * ((1-tau2)**5*(-30*tau1**2 +60*tau1**3 -30*tau1**4) + (1-tau2)**4*(60*tau1**2 - 140*tau1**3 +75*tau1**4) + \
(1-tau2)**3*(-30*tau1**2 +80*tau1**3 - 50*tau1**4))
u1=(xf-x0)*(30*tau2**2 - 60*tau2**3 + 30*tau2**4)+p1*tf**5/120*((1-tau1)**5*(-30*tau2**2 +60*tau1**3 -30*tau1**4) + \
(1-tau1)**4*(60*tau2**2 - 140*tau2**3 +75*tau2**4) + (1-tau1)**3*(-30*tau2**2 +80*tau2**3 - 50*tau2**4) \
+ 5*tau2**4 -20*tau2**3*tau1 +30*tau2**2*tau1**2 -20*tau2*tau1**3 +5*tau1**4) \
+ p2*tf**5/120*(60*tau2**9-270*tau2**8+480*tau2**7-420*tau2**6+180*tau2**5-30*tau2**4)
## system of nonlinear equations dependent on tau1 and tau2
t1=u0*p1 ### equation 1
t2=u1*p2 ### equation 2
return [t1,t2]
我尝试使用 fsolve,但是使用 fsolve 我无法得到复杂的部分。
在 python 中有什么方法可以做到这一点吗?
非常感谢您的帮助!
这有点令人困惑,因为你说你 "couldn't get the complex part" 但在问题中你说你正在寻找虚部为 0 且实部的大小介于 0 和 1 之间的解决方案。如果这是正确的,那么 nsolve
如果你给出足够好的初始猜测就可以求解这对方程:
>>> from sympy import symbols
>>> v = symbols('tau1:3')
>>> nsolve(f(v), (tau1, tau2), (.5,.4))
Matrix([
[0.495387590772031],
[ 0.49736468918969]])
通过查看 tau1
和 tau2
的不同值的 t1
和 t2
的值,您可以大致了解在哪里寻找根。因为它们都应该为零,所以我查看了平方和的对数——越小越好:
>>> Matrix(10,10,lambda i,j:
log(sqrt(sum([k.subs(tau1,i/10).subs(tau2,j/10)**2 for k in (t1,t2)]))).round())
Matrix([
[zoo, zoo, zoo, zoo, zoo, zoo, zoo, zoo, zoo, zoo],
[-17, -5, -6, -3, -2, -2, -3, -4, -5, -7],
[ -7, -2, -1, 0, 0, 0, 0, 0, -1, -2],
[ -1, 0, 3, 4, 3, 3, 4, 4, 3, 1],
[ 3, 4, 6, 7, 6, 4, 7, 7, 6, 4],
[ 5, 6, 8, 9, 9, 5, 9, 9, 8, 6],
[ 8, 8, 10, 11, 11, 6, 11, 11, 10, 8],
[ 9, 9, 11, 12, 12, 7, 12, 12, 11, 9],
[ 9, 10, 12, 13, 13, 7, 13, 13, 12, 10],
[ 8, 11, 13, 13, 13, 7, 13, 13, 12, 10]])
(当 tau1
为零时,动物园值对应于平凡的解决方案。