命令 linsolve 或 solve from sympy 无法求解一维线性方程
The commands linsolve or solve from sympy cannot solve a 1D linear equation
为了引入问题,我把我的代码写在下面:
import sympy as sp
sp.init_printing()
import numpy as np
import math
n=2
u,v=sp.symbols('u v')
a,b,c,d,h=sp.symbols('a b c d h')
k=sp.symbols('k')
diffmatrix=sp.zeros(n)
for i in range(n):
diffmatrix[i,i] = sp.symbols('D'+str(i+1))
globals()['D'+str(i+1)]=sp.symbols('D'+str(i+1))
f=[]
var=[]
var.append('u')
var.append('v')
# f.append(u+v)
# f.append(u-v**2)
f.append(a-c*u+d*v+u**2*v)
f.append(b+h*u-d*v-u**2*v)
f=sp.Matrix(f)
var=sp.Matrix(var)
jacobianmat=f.jacobian(var)
phi=[]
alpha=[]
beta=[]
psi=[]
gamma=[]
for i in range(n):
phi.append(sp.symbols('phi' + str(i)))
alpha.append(sp.symbols('alpha' + str(i)))
beta.append(sp.symbols('beta'+str(i)))
psi.append(sp.symbols('psi' + str(i)))
gamma.append(sp.symbols('gamma' + str(i)))
globals()['phi' + str(i)] = sp.symbols('phi' + str(i))
globals()['alpha' + str(i)] = sp.symbols('alpha' + str(i))
globals()['beta' + str(i)] = sp.symbols('beta' + str(i))
globals()['psi' + str(i)] = sp.symbols('psi' + str(i))
globals()['gamma' + str(i)] = sp.symbols('gamma' + str(i))
auxiliarterm=sp.linsolve(sp.Matrix([np.dot((jacobianmat-(k**2)*diffmatrix)[0:n-1],phi[0:n-1])])+sp.Matrix(jacobianmat-(k**2)*diffmatrix)[0:n-1,n-1],phi[0:n-1])
phi[0:n-1]=sp.Matrix(list(auxiliarterm))
phi[n-1]=1
doublesummationsecondorder=[]
for functionnumber in range(n):
tempsum=0
for i in range(n):
for j in range(n):
tempsum=sp.Add(tempsum,phi[i]*phi[j]*sp.diff(f[functionnumber],var[i],var[j]))
tempsum=-tempsum/4
doublesummationsecondorder.append(tempsum)
doublesummationsecondorder=sp.Matrix(doublesummationsecondorder)
alpha=sp.linsolve(sp.Matrix(np.dot(jacobianmat,alpha))-doublesummationsecondorder,alpha)
alpha=sp.Matrix(sp.Transpose(sp.Matrix(list(alpha))))
beta=sp.linsolve(sp.Matrix(np.dot(jacobianmat-4*k**2*diffmatrix,beta))-doublesummationsecondorder,beta)
beta=sp.Matrix(sp.Transpose(sp.Matrix(list(beta))))
doublesummationthirdorder1=[]
doublesummationthirdorder2=[]
triplesummationthirdorder=[]
for functionnumber in range(n):
tempsum1=0
tempsum2=0
tempsum3=0
for i in range(n):
for j in range(n):
tempsum1=sp.Add(tempsum1,phi[i]*(alpha[j]+beta[j]/2)*sp.diff(f[functionnumber],var[i],var[j]))
tempsum2=sp.Add(tempsum2,phi[i]*beta[j]*sp.diff(f[functionnumber],var[i],var[j]))
for l in range(n):
tempsum3=sp.Add(tempsum3,phi[i]*phi[j]*phi[l]*sp.diff(f[functionnumber],var[i],var[j],var[l]))
doublesummationthirdorder1.append(tempsum1)
doublesummationthirdorder2.append(tempsum2)
triplesummationthirdorder.append(tempsum3)
doublesummationthirdorder1=sp.Matrix(doublesummationthirdorder1)
doublesummationthirdorder2=sp.Matrix(doublesummationthirdorder2)
triplesummationthirdorder=sp.Matrix(triplesummationthirdorder)
auxiliarterm=sp.linsolve(sp.Matrix([np.dot((sp.matrices.Transpose(jacobianmat)-(k**2)*diffmatrix)[0:n-1],psi[0:n-1])])+sp.Matrix(sp.matrices.Transpose(jacobianmat)-(k**2)*diffmatrix)[0:n-1,n-1],psi[0:n-1])
psi[0:n-1]=sp.Matrix(list(auxiliarterm))
psi[n-1]=1
print('Almost ready')
auxiliarterm=sp.solve(sp.Matrix([np.dot((jacobianmat-(k**2)*diffmatrix)[0:n-1],gamma[0:n-1])])+sp.Matrix(doublesummationthirdorder1[0:n-1])+sp.Matrix(3/math.factorial(4)*sp.Matrix(triplesummationthirdorder[0:n-1])),gamma[0:n-1])
如您所见,当 n=2 时,最后求解的方程是一维(线性)方程。问题是,由于某种原因,我无法得到它的解决方案。在任何情况下,如果我尝试使用 f=[u+v,u-v^2] 给出的另一个向量场,那么一切正常。我想知道这是内存的问题,符号计算的效率还是我的代码有问题。
万事如意。
问题是求解器会尝试扩展您拥有的表达式,并且这些表达式在扩展时会变大,所以速度很慢。对于符号抵消的线性方程组,通常需要扩展。在这种情况下,因为它只是一个方程式,所以如果您确定存在唯一解,则可以跳过该步骤:
In [41]: a = Wild('a')
In [42]: b = Wild('b')
In [43]: match = eq[0].match(a*s[0]+b)
In [44]: sol = -match[b]/match[a]
In [45]: sol
Out[45]:
⎛ 2 2
⎛ 2⎞ ⎜ 2⋅D₁⋅k ⋅u + 2⋅c⋅u + d⋅v - 3⋅u ⋅v
2⋅u⋅⎝d + u ⎠⋅⎜───────────────────────────────────────────────────────────── + ──────────────────────────────────────────────────────────────────────────────
⎜ 2 4 2 2 2 2 2 ⎛ 3 8 3 6 3 6 2 2 6 2 6
⎝2⋅D₁ ⋅k + 4⋅D₁⋅c⋅k - 8⋅D₁⋅k ⋅u⋅v + 2⋅c - 8⋅c⋅u⋅v + 8⋅u ⋅v 2⋅⎝32⋅D₁ ⋅D₂⋅k + 8⋅D₁ ⋅d⋅k + 8⋅D₁ ⋅k ⋅u + 72⋅D₁ ⋅D₂⋅c⋅k - 144⋅D₁ ⋅D₂⋅k ⋅u⋅
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 4 2 4 3 2
8⋅D₁ ⋅d⋅k ⋅u + 8⋅D₁ ⋅k ⋅u + 10⋅D₁⋅c⋅d⋅k ⋅u +
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 4 2 4 2 2 4 2 4 2 4 2 2 4 3 2 4 4 4 2
v + 18⋅D₁ ⋅c⋅d⋅k + 18⋅D₁ ⋅c⋅k ⋅u - 2⋅D₁ ⋅d⋅h⋅k - 32⋅D₁ ⋅d⋅k ⋅u⋅v - 2⋅D₁ ⋅h⋅k ⋅u - 32⋅D₁ ⋅k ⋅u ⋅v + 48⋅D₁⋅D₂⋅c ⋅k - 192⋅D₁⋅D₂⋅c⋅k ⋅u⋅v + 192⋅D₁⋅D₂⋅k ⋅u
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 3 2 2 2 2 2 2 3 2 4 2 2 3 2 2
10⋅D₁⋅c⋅k ⋅u + 4⋅D₁⋅d ⋅k ⋅v - 2⋅D₁⋅d⋅h⋅k ⋅u - 8⋅D₁⋅d⋅k ⋅u ⋅v - 2⋅D₁⋅h⋅k ⋅u - 12⋅D₁⋅k ⋅u ⋅v + 2⋅c ⋅d⋅u + 2⋅c ⋅u + c⋅d ⋅v - 2⋅c⋅d⋅h⋅u - 2⋅c⋅d⋅u ⋅v - 2⋅c⋅h
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2
⋅v + 12⋅D₁⋅c ⋅d⋅k + 12⋅D₁⋅c ⋅k ⋅u - 4⋅D₁⋅c⋅d⋅h⋅k - 40⋅D₁⋅c⋅d⋅k ⋅u⋅v - 4⋅D₁⋅c⋅h⋅k ⋅u - 40⋅D₁⋅c⋅k ⋅u ⋅v + 8⋅D₁⋅d⋅h⋅k ⋅u⋅v + 32⋅D₁⋅d⋅k ⋅u ⋅v + 8⋅D₁⋅h⋅k ⋅
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2
D₁⋅k + c - 2⋅u⋅v
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
3 4 2 2 4
⋅u - 3⋅c⋅u ⋅v - d ⋅h⋅v + 2⋅d⋅h⋅u ⋅v + 3⋅h⋅u ⋅v
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
3 2 4 2 3 2 2 2 2 2 2 2 3 3 3 3 2 2 2 2 2 2 3
u ⋅v + 32⋅D₁⋅k ⋅u ⋅v + 8⋅D₂⋅c ⋅k - 48⋅D₂⋅c ⋅k ⋅u⋅v + 96⋅D₂⋅c⋅k ⋅u ⋅v - 64⋅D₂⋅k ⋅u ⋅v + 2⋅c ⋅d + 2⋅c ⋅u - 2⋅c ⋅d⋅h - 8⋅c ⋅d⋅u⋅v - 2⋅c ⋅h⋅u - 8⋅c ⋅u ⋅v
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⎞
⎟
───────────────────────────────────────────────────────────────────────────────⎟
2 2 3 4 2 2 2 4 2⎞⎟
+ 8⋅c⋅d⋅h⋅u⋅v + 8⋅c⋅d⋅u ⋅v + 8⋅c⋅h⋅u ⋅v + 8⋅c⋅u ⋅v - 8⋅d⋅h⋅u ⋅v - 8⋅h⋅u ⋅v ⎠⎠
──────────────────────────────────────────────────────────────────────────────── - ─────────────────────────────────────────────────────────────────────────
3 8 3 6 3 6 2 2 6 2 6
16⋅D₁ ⋅D₂⋅k + 4⋅D₁ ⋅d⋅k + 4⋅D₁ ⋅k ⋅u + 36⋅D₁ ⋅D₂⋅c⋅k - 72⋅D₁ ⋅D₂⋅k ⋅u
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 4 2 4 2 2 4 2 4 2 4 2 2 4 3 2 4 4 4 2 2
⋅v + 9⋅D₁ ⋅c⋅d⋅k + 9⋅D₁ ⋅c⋅k ⋅u - D₁ ⋅d⋅h⋅k - 16⋅D₁ ⋅d⋅k ⋅u⋅v - D₁ ⋅h⋅k ⋅u - 16⋅D₁ ⋅k ⋅u ⋅v + 24⋅D₁⋅D₂⋅c ⋅k - 96⋅D₁⋅D₂⋅c⋅k ⋅u⋅v + 96⋅D₁⋅D₂⋅k ⋅u ⋅v + 6
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⎛ 4 4 3 2 2 3 2 2 2 2 2 4 ⎞
u⋅⎝4⋅D₁⋅D₂⋅d⋅k ⋅u + 4⋅D₁⋅D₂⋅k ⋅u + 4⋅D₂⋅c⋅d⋅k ⋅u + 4⋅D₂⋅c⋅k ⋅u + 2⋅D₂⋅d ⋅k ⋅v - 4⋅D₂⋅d⋅k ⋅u ⋅v - 6⋅D₂⋅k ⋅u ⋅v⎠
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 3
⋅D₁⋅c ⋅d⋅k + 6⋅D₁⋅c ⋅k ⋅u - 2⋅D₁⋅c⋅d⋅h⋅k - 20⋅D₁⋅c⋅d⋅k ⋅u⋅v - 2⋅D₁⋅c⋅h⋅k ⋅u - 20⋅D₁⋅c⋅k ⋅u ⋅v + 4⋅D₁⋅d⋅h⋅k ⋅u⋅v + 16⋅D₁⋅d⋅k ⋅u ⋅v + 4⋅D₁⋅h⋅k ⋅u ⋅v + 16
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2
- D₁⋅k - c + 2⋅u⋅v
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 4 2 3 2 2 2 2 2 2 2 3 3 3 3 2 2 2 2 2 2 3
⋅D₁⋅k ⋅u ⋅v + 4⋅D₂⋅c ⋅k - 24⋅D₂⋅c ⋅k ⋅u⋅v + 48⋅D₂⋅c⋅k ⋅u ⋅v - 32⋅D₂⋅k ⋅u ⋅v + c ⋅d + c ⋅u - c ⋅d⋅h - 4⋅c ⋅d⋅u⋅v - c ⋅h⋅u - 4⋅c ⋅u ⋅v + 4⋅c⋅d⋅h⋅u⋅v + 4
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────── - ────────────────────────────────────────────────────────────────────────────────────────────
2 2 3 4 2 2 2 4 2 ⎛ 2 ⎞ ⎛ 3 8 3 6 3 6 2 2 6 2 6
⋅c⋅d⋅u ⋅v + 4⋅c⋅h⋅u ⋅v + 4⋅c⋅u ⋅v - 4⋅d⋅h⋅u ⋅v - 4⋅h⋅u ⋅v ⎝D₁⋅k + c - 2⋅u⋅v⎠⋅⎝16⋅D₁ ⋅D₂⋅k + 4⋅D₁ ⋅d⋅k + 4⋅D₁ ⋅k ⋅u + 36⋅D₁ ⋅D₂⋅c⋅k - 72⋅D₁ ⋅D₂⋅k
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 4 2 4 2 2 4 2 4 2 4 2 2 4 3 2 4 4 4 2 2
⋅u⋅v + 9⋅D₁ ⋅c⋅d⋅k + 9⋅D₁ ⋅c⋅k ⋅u - D₁ ⋅d⋅h⋅k - 16⋅D₁ ⋅d⋅k ⋅u⋅v - D₁ ⋅h⋅k ⋅u - 16⋅D₁ ⋅k ⋅u ⋅v + 24⋅D₁⋅D₂⋅c ⋅k - 96⋅D₁⋅D₂⋅c⋅k ⋅u⋅v + 96⋅D₁⋅D₂⋅k ⋅u ⋅v +
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⎛ 2⎞ ⎛ 4 4 3 2 2 3 2 2 2 2 2 4 ⎞
v⋅⎝d + u ⎠⋅⎝4⋅D₁⋅D₂⋅d⋅k ⋅u + 4⋅D₁⋅D₂⋅k ⋅u + 4⋅D₂⋅c⋅d⋅k ⋅u + 4⋅D₂⋅c⋅k ⋅u + 2⋅D₂⋅d ⋅k ⋅v - 4⋅D₂⋅d⋅k ⋅u ⋅v - 6⋅D₂⋅k ⋅u ⋅v⎠
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 3
6⋅D₁⋅c ⋅d⋅k + 6⋅D₁⋅c ⋅k ⋅u - 2⋅D₁⋅c⋅d⋅h⋅k - 20⋅D₁⋅c⋅d⋅k ⋅u⋅v - 2⋅D₁⋅c⋅h⋅k ⋅u - 20⋅D₁⋅c⋅k ⋅u ⋅v + 4⋅D₁⋅d⋅h⋅k ⋅u⋅v + 16⋅D₁⋅d⋅k ⋅u ⋅v + 4⋅D₁⋅h⋅k ⋅u ⋅v +
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 4 2 3 2 2 2 2 2 2 2 3 3 3 3 2 2 2 2 2 2 3
16⋅D₁⋅k ⋅u ⋅v + 4⋅D₂⋅c ⋅k - 24⋅D₂⋅c ⋅k ⋅u⋅v + 48⋅D₂⋅c⋅k ⋅u ⋅v - 32⋅D₂⋅k ⋅u ⋅v + c ⋅d + c ⋅u - c ⋅d⋅h - 4⋅c ⋅d⋅u⋅v - c ⋅h⋅u - 4⋅c ⋅u ⋅v + 4⋅c⋅d⋅h⋅u⋅v +
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2
⎛ 2⎞
0.75⋅⎝d + u ⎠
──────────────────────────────────────────────────────────────── - ────────────────────
2 2 3 4 2 2 2 4 2⎞ 2
4⋅c⋅d⋅u ⋅v + 4⋅c⋅h⋅u ⋅v + 4⋅c⋅u ⋅v - 4⋅d⋅h⋅u ⋅v - 4⋅h⋅u ⋅v ⎠ ⎛ 2 ⎞
⎝D₁⋅k + c - 2⋅u⋅v⎠
───────────────────────────────────────────────────────────────────────────────────────
另请注意,其中有一个 Float (0.75
)。我会确保这里只使用有理数,因为浮点系数的多项式运算没有很好的定义。
正如 Oscar 指出的那样,表达式很大,求解过程在处理所有符号时陷入困境。以下例程将简化表达式,让您使用一小组符号:
def keepx(eq, x):
"""collapse non-x dependent Add and Mul into Duumy symbols
and return e, r where e is the new expresion and r is
the dictionary that can restore e: eq == e.xreplace(r)
Examples
========
>>> from sympy import solve, symbols
>>> from sympy.abc import x
>>> y = symbols('y', positive=True)
>>> eq = 1/(3*x*y + 1) + 4*x*y + 5
Dummy symbols with no name are used to keep track of the
constants. The retain unique identity, however:
>>> e, r = keepx(eq, x); e
_ + _*x + 1/(_ + _*x)
>>> assert e.xreplace(r) == eq
>>> sol = solve(eq, x)
>>> _sol = [i.xreplace(r).factor() for i in solve(e, x)]
>>> assert sol == _sol
"""
reps = {}
def store(i):
d = Dummy('')
reps[d] = i
return d
def do(e):
if e.is_Add or e.is_Mul:
i, d = e.as_independent(x)
if i is not e.identity:
i = store(i)
d = do(d)
return e.func(i, d)
if not e.args:
return e
return e.func(*[do(i) for i in e.args])
return do(eq), reps
要在您的案例中使用它来获得解决方案,只需执行以下操作:
>>> eq, x = (sp.Matrix([np.dot((jacobianmat-(k**2)*diffmatrix)[
0:n-1],gamma[0:n-1])])+sp.Matrix(doublesummationthirdorder1[0:n-
1])+sp.Matrix(3/math.factorial(4)*sp.Matrix(triplesummationthirdorder[0:n-
1])),gamma[0:n-1])
>>> e, r = keepx(eq, x)
>>> auxiliarterm = solve(e, x)[0].xreplace(r)
它仍然是一个笨拙的表达式,但现在您可以快速解决问题(以及您可以在需要屏蔽“噪音”以便能够使用表达式的核心时使用的例程) .
为了引入问题,我把我的代码写在下面:
import sympy as sp
sp.init_printing()
import numpy as np
import math
n=2
u,v=sp.symbols('u v')
a,b,c,d,h=sp.symbols('a b c d h')
k=sp.symbols('k')
diffmatrix=sp.zeros(n)
for i in range(n):
diffmatrix[i,i] = sp.symbols('D'+str(i+1))
globals()['D'+str(i+1)]=sp.symbols('D'+str(i+1))
f=[]
var=[]
var.append('u')
var.append('v')
# f.append(u+v)
# f.append(u-v**2)
f.append(a-c*u+d*v+u**2*v)
f.append(b+h*u-d*v-u**2*v)
f=sp.Matrix(f)
var=sp.Matrix(var)
jacobianmat=f.jacobian(var)
phi=[]
alpha=[]
beta=[]
psi=[]
gamma=[]
for i in range(n):
phi.append(sp.symbols('phi' + str(i)))
alpha.append(sp.symbols('alpha' + str(i)))
beta.append(sp.symbols('beta'+str(i)))
psi.append(sp.symbols('psi' + str(i)))
gamma.append(sp.symbols('gamma' + str(i)))
globals()['phi' + str(i)] = sp.symbols('phi' + str(i))
globals()['alpha' + str(i)] = sp.symbols('alpha' + str(i))
globals()['beta' + str(i)] = sp.symbols('beta' + str(i))
globals()['psi' + str(i)] = sp.symbols('psi' + str(i))
globals()['gamma' + str(i)] = sp.symbols('gamma' + str(i))
auxiliarterm=sp.linsolve(sp.Matrix([np.dot((jacobianmat-(k**2)*diffmatrix)[0:n-1],phi[0:n-1])])+sp.Matrix(jacobianmat-(k**2)*diffmatrix)[0:n-1,n-1],phi[0:n-1])
phi[0:n-1]=sp.Matrix(list(auxiliarterm))
phi[n-1]=1
doublesummationsecondorder=[]
for functionnumber in range(n):
tempsum=0
for i in range(n):
for j in range(n):
tempsum=sp.Add(tempsum,phi[i]*phi[j]*sp.diff(f[functionnumber],var[i],var[j]))
tempsum=-tempsum/4
doublesummationsecondorder.append(tempsum)
doublesummationsecondorder=sp.Matrix(doublesummationsecondorder)
alpha=sp.linsolve(sp.Matrix(np.dot(jacobianmat,alpha))-doublesummationsecondorder,alpha)
alpha=sp.Matrix(sp.Transpose(sp.Matrix(list(alpha))))
beta=sp.linsolve(sp.Matrix(np.dot(jacobianmat-4*k**2*diffmatrix,beta))-doublesummationsecondorder,beta)
beta=sp.Matrix(sp.Transpose(sp.Matrix(list(beta))))
doublesummationthirdorder1=[]
doublesummationthirdorder2=[]
triplesummationthirdorder=[]
for functionnumber in range(n):
tempsum1=0
tempsum2=0
tempsum3=0
for i in range(n):
for j in range(n):
tempsum1=sp.Add(tempsum1,phi[i]*(alpha[j]+beta[j]/2)*sp.diff(f[functionnumber],var[i],var[j]))
tempsum2=sp.Add(tempsum2,phi[i]*beta[j]*sp.diff(f[functionnumber],var[i],var[j]))
for l in range(n):
tempsum3=sp.Add(tempsum3,phi[i]*phi[j]*phi[l]*sp.diff(f[functionnumber],var[i],var[j],var[l]))
doublesummationthirdorder1.append(tempsum1)
doublesummationthirdorder2.append(tempsum2)
triplesummationthirdorder.append(tempsum3)
doublesummationthirdorder1=sp.Matrix(doublesummationthirdorder1)
doublesummationthirdorder2=sp.Matrix(doublesummationthirdorder2)
triplesummationthirdorder=sp.Matrix(triplesummationthirdorder)
auxiliarterm=sp.linsolve(sp.Matrix([np.dot((sp.matrices.Transpose(jacobianmat)-(k**2)*diffmatrix)[0:n-1],psi[0:n-1])])+sp.Matrix(sp.matrices.Transpose(jacobianmat)-(k**2)*diffmatrix)[0:n-1,n-1],psi[0:n-1])
psi[0:n-1]=sp.Matrix(list(auxiliarterm))
psi[n-1]=1
print('Almost ready')
auxiliarterm=sp.solve(sp.Matrix([np.dot((jacobianmat-(k**2)*diffmatrix)[0:n-1],gamma[0:n-1])])+sp.Matrix(doublesummationthirdorder1[0:n-1])+sp.Matrix(3/math.factorial(4)*sp.Matrix(triplesummationthirdorder[0:n-1])),gamma[0:n-1])
如您所见,当 n=2 时,最后求解的方程是一维(线性)方程。问题是,由于某种原因,我无法得到它的解决方案。在任何情况下,如果我尝试使用 f=[u+v,u-v^2] 给出的另一个向量场,那么一切正常。我想知道这是内存的问题,符号计算的效率还是我的代码有问题。
万事如意。
问题是求解器会尝试扩展您拥有的表达式,并且这些表达式在扩展时会变大,所以速度很慢。对于符号抵消的线性方程组,通常需要扩展。在这种情况下,因为它只是一个方程式,所以如果您确定存在唯一解,则可以跳过该步骤:
In [41]: a = Wild('a')
In [42]: b = Wild('b')
In [43]: match = eq[0].match(a*s[0]+b)
In [44]: sol = -match[b]/match[a]
In [45]: sol
Out[45]:
⎛ 2 2
⎛ 2⎞ ⎜ 2⋅D₁⋅k ⋅u + 2⋅c⋅u + d⋅v - 3⋅u ⋅v
2⋅u⋅⎝d + u ⎠⋅⎜───────────────────────────────────────────────────────────── + ──────────────────────────────────────────────────────────────────────────────
⎜ 2 4 2 2 2 2 2 ⎛ 3 8 3 6 3 6 2 2 6 2 6
⎝2⋅D₁ ⋅k + 4⋅D₁⋅c⋅k - 8⋅D₁⋅k ⋅u⋅v + 2⋅c - 8⋅c⋅u⋅v + 8⋅u ⋅v 2⋅⎝32⋅D₁ ⋅D₂⋅k + 8⋅D₁ ⋅d⋅k + 8⋅D₁ ⋅k ⋅u + 72⋅D₁ ⋅D₂⋅c⋅k - 144⋅D₁ ⋅D₂⋅k ⋅u⋅
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 4 2 4 3 2
8⋅D₁ ⋅d⋅k ⋅u + 8⋅D₁ ⋅k ⋅u + 10⋅D₁⋅c⋅d⋅k ⋅u +
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 4 2 4 2 2 4 2 4 2 4 2 2 4 3 2 4 4 4 2
v + 18⋅D₁ ⋅c⋅d⋅k + 18⋅D₁ ⋅c⋅k ⋅u - 2⋅D₁ ⋅d⋅h⋅k - 32⋅D₁ ⋅d⋅k ⋅u⋅v - 2⋅D₁ ⋅h⋅k ⋅u - 32⋅D₁ ⋅k ⋅u ⋅v + 48⋅D₁⋅D₂⋅c ⋅k - 192⋅D₁⋅D₂⋅c⋅k ⋅u⋅v + 192⋅D₁⋅D₂⋅k ⋅u
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 3 2 2 2 2 2 2 3 2 4 2 2 3 2 2
10⋅D₁⋅c⋅k ⋅u + 4⋅D₁⋅d ⋅k ⋅v - 2⋅D₁⋅d⋅h⋅k ⋅u - 8⋅D₁⋅d⋅k ⋅u ⋅v - 2⋅D₁⋅h⋅k ⋅u - 12⋅D₁⋅k ⋅u ⋅v + 2⋅c ⋅d⋅u + 2⋅c ⋅u + c⋅d ⋅v - 2⋅c⋅d⋅h⋅u - 2⋅c⋅d⋅u ⋅v - 2⋅c⋅h
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2
⋅v + 12⋅D₁⋅c ⋅d⋅k + 12⋅D₁⋅c ⋅k ⋅u - 4⋅D₁⋅c⋅d⋅h⋅k - 40⋅D₁⋅c⋅d⋅k ⋅u⋅v - 4⋅D₁⋅c⋅h⋅k ⋅u - 40⋅D₁⋅c⋅k ⋅u ⋅v + 8⋅D₁⋅d⋅h⋅k ⋅u⋅v + 32⋅D₁⋅d⋅k ⋅u ⋅v + 8⋅D₁⋅h⋅k ⋅
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2
D₁⋅k + c - 2⋅u⋅v
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
3 4 2 2 4
⋅u - 3⋅c⋅u ⋅v - d ⋅h⋅v + 2⋅d⋅h⋅u ⋅v + 3⋅h⋅u ⋅v
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
3 2 4 2 3 2 2 2 2 2 2 2 3 3 3 3 2 2 2 2 2 2 3
u ⋅v + 32⋅D₁⋅k ⋅u ⋅v + 8⋅D₂⋅c ⋅k - 48⋅D₂⋅c ⋅k ⋅u⋅v + 96⋅D₂⋅c⋅k ⋅u ⋅v - 64⋅D₂⋅k ⋅u ⋅v + 2⋅c ⋅d + 2⋅c ⋅u - 2⋅c ⋅d⋅h - 8⋅c ⋅d⋅u⋅v - 2⋅c ⋅h⋅u - 8⋅c ⋅u ⋅v
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⎞
⎟
───────────────────────────────────────────────────────────────────────────────⎟
2 2 3 4 2 2 2 4 2⎞⎟
+ 8⋅c⋅d⋅h⋅u⋅v + 8⋅c⋅d⋅u ⋅v + 8⋅c⋅h⋅u ⋅v + 8⋅c⋅u ⋅v - 8⋅d⋅h⋅u ⋅v - 8⋅h⋅u ⋅v ⎠⎠
──────────────────────────────────────────────────────────────────────────────── - ─────────────────────────────────────────────────────────────────────────
3 8 3 6 3 6 2 2 6 2 6
16⋅D₁ ⋅D₂⋅k + 4⋅D₁ ⋅d⋅k + 4⋅D₁ ⋅k ⋅u + 36⋅D₁ ⋅D₂⋅c⋅k - 72⋅D₁ ⋅D₂⋅k ⋅u
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 4 2 4 2 2 4 2 4 2 4 2 2 4 3 2 4 4 4 2 2
⋅v + 9⋅D₁ ⋅c⋅d⋅k + 9⋅D₁ ⋅c⋅k ⋅u - D₁ ⋅d⋅h⋅k - 16⋅D₁ ⋅d⋅k ⋅u⋅v - D₁ ⋅h⋅k ⋅u - 16⋅D₁ ⋅k ⋅u ⋅v + 24⋅D₁⋅D₂⋅c ⋅k - 96⋅D₁⋅D₂⋅c⋅k ⋅u⋅v + 96⋅D₁⋅D₂⋅k ⋅u ⋅v + 6
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⎛ 4 4 3 2 2 3 2 2 2 2 2 4 ⎞
u⋅⎝4⋅D₁⋅D₂⋅d⋅k ⋅u + 4⋅D₁⋅D₂⋅k ⋅u + 4⋅D₂⋅c⋅d⋅k ⋅u + 4⋅D₂⋅c⋅k ⋅u + 2⋅D₂⋅d ⋅k ⋅v - 4⋅D₂⋅d⋅k ⋅u ⋅v - 6⋅D₂⋅k ⋅u ⋅v⎠
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 3
⋅D₁⋅c ⋅d⋅k + 6⋅D₁⋅c ⋅k ⋅u - 2⋅D₁⋅c⋅d⋅h⋅k - 20⋅D₁⋅c⋅d⋅k ⋅u⋅v - 2⋅D₁⋅c⋅h⋅k ⋅u - 20⋅D₁⋅c⋅k ⋅u ⋅v + 4⋅D₁⋅d⋅h⋅k ⋅u⋅v + 16⋅D₁⋅d⋅k ⋅u ⋅v + 4⋅D₁⋅h⋅k ⋅u ⋅v + 16
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2
- D₁⋅k - c + 2⋅u⋅v
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 4 2 3 2 2 2 2 2 2 2 3 3 3 3 2 2 2 2 2 2 3
⋅D₁⋅k ⋅u ⋅v + 4⋅D₂⋅c ⋅k - 24⋅D₂⋅c ⋅k ⋅u⋅v + 48⋅D₂⋅c⋅k ⋅u ⋅v - 32⋅D₂⋅k ⋅u ⋅v + c ⋅d + c ⋅u - c ⋅d⋅h - 4⋅c ⋅d⋅u⋅v - c ⋅h⋅u - 4⋅c ⋅u ⋅v + 4⋅c⋅d⋅h⋅u⋅v + 4
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────── - ────────────────────────────────────────────────────────────────────────────────────────────
2 2 3 4 2 2 2 4 2 ⎛ 2 ⎞ ⎛ 3 8 3 6 3 6 2 2 6 2 6
⋅c⋅d⋅u ⋅v + 4⋅c⋅h⋅u ⋅v + 4⋅c⋅u ⋅v - 4⋅d⋅h⋅u ⋅v - 4⋅h⋅u ⋅v ⎝D₁⋅k + c - 2⋅u⋅v⎠⋅⎝16⋅D₁ ⋅D₂⋅k + 4⋅D₁ ⋅d⋅k + 4⋅D₁ ⋅k ⋅u + 36⋅D₁ ⋅D₂⋅c⋅k - 72⋅D₁ ⋅D₂⋅k
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 4 2 4 2 2 4 2 4 2 4 2 2 4 3 2 4 4 4 2 2
⋅u⋅v + 9⋅D₁ ⋅c⋅d⋅k + 9⋅D₁ ⋅c⋅k ⋅u - D₁ ⋅d⋅h⋅k - 16⋅D₁ ⋅d⋅k ⋅u⋅v - D₁ ⋅h⋅k ⋅u - 16⋅D₁ ⋅k ⋅u ⋅v + 24⋅D₁⋅D₂⋅c ⋅k - 96⋅D₁⋅D₂⋅c⋅k ⋅u⋅v + 96⋅D₁⋅D₂⋅k ⋅u ⋅v +
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⎛ 2⎞ ⎛ 4 4 3 2 2 3 2 2 2 2 2 4 ⎞
v⋅⎝d + u ⎠⋅⎝4⋅D₁⋅D₂⋅d⋅k ⋅u + 4⋅D₁⋅D₂⋅k ⋅u + 4⋅D₂⋅c⋅d⋅k ⋅u + 4⋅D₂⋅c⋅k ⋅u + 2⋅D₂⋅d ⋅k ⋅v - 4⋅D₂⋅d⋅k ⋅u ⋅v - 6⋅D₂⋅k ⋅u ⋅v⎠
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 3
6⋅D₁⋅c ⋅d⋅k + 6⋅D₁⋅c ⋅k ⋅u - 2⋅D₁⋅c⋅d⋅h⋅k - 20⋅D₁⋅c⋅d⋅k ⋅u⋅v - 2⋅D₁⋅c⋅h⋅k ⋅u - 20⋅D₁⋅c⋅k ⋅u ⋅v + 4⋅D₁⋅d⋅h⋅k ⋅u⋅v + 16⋅D₁⋅d⋅k ⋅u ⋅v + 4⋅D₁⋅h⋅k ⋅u ⋅v +
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2 4 2 3 2 2 2 2 2 2 2 3 3 3 3 2 2 2 2 2 2 3
16⋅D₁⋅k ⋅u ⋅v + 4⋅D₂⋅c ⋅k - 24⋅D₂⋅c ⋅k ⋅u⋅v + 48⋅D₂⋅c⋅k ⋅u ⋅v - 32⋅D₂⋅k ⋅u ⋅v + c ⋅d + c ⋅u - c ⋅d⋅h - 4⋅c ⋅d⋅u⋅v - c ⋅h⋅u - 4⋅c ⋅u ⋅v + 4⋅c⋅d⋅h⋅u⋅v +
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2
⎛ 2⎞
0.75⋅⎝d + u ⎠
──────────────────────────────────────────────────────────────── - ────────────────────
2 2 3 4 2 2 2 4 2⎞ 2
4⋅c⋅d⋅u ⋅v + 4⋅c⋅h⋅u ⋅v + 4⋅c⋅u ⋅v - 4⋅d⋅h⋅u ⋅v - 4⋅h⋅u ⋅v ⎠ ⎛ 2 ⎞
⎝D₁⋅k + c - 2⋅u⋅v⎠
───────────────────────────────────────────────────────────────────────────────────────
另请注意,其中有一个 Float (0.75
)。我会确保这里只使用有理数,因为浮点系数的多项式运算没有很好的定义。
正如 Oscar 指出的那样,表达式很大,求解过程在处理所有符号时陷入困境。以下例程将简化表达式,让您使用一小组符号:
def keepx(eq, x):
"""collapse non-x dependent Add and Mul into Duumy symbols
and return e, r where e is the new expresion and r is
the dictionary that can restore e: eq == e.xreplace(r)
Examples
========
>>> from sympy import solve, symbols
>>> from sympy.abc import x
>>> y = symbols('y', positive=True)
>>> eq = 1/(3*x*y + 1) + 4*x*y + 5
Dummy symbols with no name are used to keep track of the
constants. The retain unique identity, however:
>>> e, r = keepx(eq, x); e
_ + _*x + 1/(_ + _*x)
>>> assert e.xreplace(r) == eq
>>> sol = solve(eq, x)
>>> _sol = [i.xreplace(r).factor() for i in solve(e, x)]
>>> assert sol == _sol
"""
reps = {}
def store(i):
d = Dummy('')
reps[d] = i
return d
def do(e):
if e.is_Add or e.is_Mul:
i, d = e.as_independent(x)
if i is not e.identity:
i = store(i)
d = do(d)
return e.func(i, d)
if not e.args:
return e
return e.func(*[do(i) for i in e.args])
return do(eq), reps
要在您的案例中使用它来获得解决方案,只需执行以下操作:
>>> eq, x = (sp.Matrix([np.dot((jacobianmat-(k**2)*diffmatrix)[
0:n-1],gamma[0:n-1])])+sp.Matrix(doublesummationthirdorder1[0:n-
1])+sp.Matrix(3/math.factorial(4)*sp.Matrix(triplesummationthirdorder[0:n-
1])),gamma[0:n-1])
>>> e, r = keepx(eq, x)
>>> auxiliarterm = solve(e, x)[0].xreplace(r)
它仍然是一个笨拙的表达式,但现在您可以快速解决问题(以及您可以在需要屏蔽“噪音”以便能够使用表达式的核心时使用的例程) .