【发布时间】:2021-10-03 17:37:07
【问题描述】:
我一直在尝试使用 Python 中的 Sympy/Numpy 求解一个由 10,000 个非线性方程组组成的系统,该方程组包含 100 个变量。
目前的尝试:
我在 Sympy 中尝试了 nsolve 和 solve,在 numpy.linalg 中求解,所有这些都在等待 5-6 小时后仍在运行(我最终在 RAM 用完时强制停止它们)。
使用 Sympy 本身生成一组方程大约需要 1 小时。我切换到 SageMath(Windows 原生),它似乎可以更好地生成方程本身(约 3 分钟),但仍然无法解决它们。
有没有办法使用 SageMath/Python 本身中的任何特定语言或技巧来优化运行,或者我应该寻找更强大的系统来运行代码?
我的系统是 i7-11300H/16GB RAM。
编辑:linalg.solve 是一个错误,因为我最初认为它是一个线性系统,后来意识到它不是。
编辑:
from sympy import *
x,t=symbols('x,t')
a11, a12, a13, a14, a15, a16, a17, a18, a19, a21, a22, a23, a24 = symbols('a11, a12, a13, a14, a15, a16, a17, a18, a19, a21, a22, a23, a24')
Coeffs = [a11, a12, a13, a14, a15, a16, a17, a18, a19, a21, a22, a23, a24]
#E = expression in x,t,aij, 0<i<11,0<j<11 (nonlinear in aij)
## Sample
E = 1/2*(9*(8*t + 1)*a11 + 3*(t**2 + 2*t + 1)*a21 + 4*(t**3 + 3*t**2 + 3*t + 1)*a12 + 5*(t**4 + 4*t**3)*a13 + 6*(t**5 + 5*t**4)*a14 + 7*(t**6 + 6*t**5 + 1)*a15 + 8*(t**7 + 7*t)*a16 + 2*a17*(t + 1) + a18)*x**2 + 1/48*(13860*(252*(t**10 + 10*t)*a19 + 1260*(t**2 + 2*t)*a21 + 840*(t**3 + 3*t**2 + 3*t)*a22 + 630*(t**4)*a23 + 504*(t**5 + 10*t**2 + 5*t))*a24)
Eqs = [E.subs({x:1/k,t:1/m}) for k in range(1,100) for m in range(1,100)]
sol = solve(Eqs, Coeffs)
还尝试使用 0 数组作为初始值的 nsolve。
【问题讨论】:
-
对于为什么这些事情运行缓慢的原因有很多可能的解释,并且可能有很多方法可以让您进行更改以加快速度。你没有给我足够的细节让我说更具体的事情。我也不清楚,因为您说系统是非线性的,但您使用的是 linalg.solve ,它用于线性方程组的平方系统。最后,令我惊讶的是,您期望从这种过度约束的系统中找到任何解决方案。我从来没有见过 linalg.solve 只要你描述的那样接近任何地方,但我想我不明白你在做什么。
-
@OscarBenjamin linalg.solve 是一个错误,是的。我最初将它们视为线性系统,后来意识到我正在处理非线性,切换回 sympy。
-
另外,要么你没有任何解,要么你有许多可以简化的共线方程。而且我看不出 a_ij 变量的非线性在哪里。
-
确实,系统看起来非常冗余。我的猜测是您正试图以迂回的方式将
x,t项的系数等同于零。我添加了一个答案,显示如何直接执行此操作。
标签: python numpy math sympy sage