我一直在尝试使用Python中的Sympy/Numpy来解决一个包含10000个非线性方程组和100个变量的系统
迄今为止:
我尝试了Sympy的solve和solve,numpy.linalg中的solve和solve,经过5-6个小时的等待后,它们仍然在运行(当我的内存用完时,我强制停止了它们)
用Symphy本身生成方程组需要约1小时。我转向了SageMath(Windows native),它似乎能更好地生成方程(约3分钟),但仍然无法解决这些问题
有没有办法使用SageMath/Python中的任何特定语言或技巧来优化运行,或者我应该寻找一个更强大的系统来运行代码
我的系统是i7-11300H/16gbram
编辑: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
在你更新了你的问题之后,我想我理解你在做什么,但我认为你没有以正确的方式处理问题
首先,定义方程组的方法引入了浮点系数,带浮点数的多项式方程可能是病态的,因此请确保使用例如
S(1)/2
或Rational(1, 2)
而不是像这样使用1/2
:所以你有
E
看起来像这样:带有
a24
的E
的第一项使得这个非线性,但只是稍微非线性,因为它是二次和多项式,而不是说超越的或什么的(你之前只描述你的方程为非线性,可能意味着什么)您将用100个不同的值替换
x
和t
中的每一个,然后尝试求解10000个方程,使这些值的E
为零。几乎可以保证,这些方程的唯一可能解是那些使x,t
多项式的所有系数为零的解。我想你实际上想做的是找到ai
符号的值,这些符号使E
为零,但我们不需要10000个方程来实现这一点。我们只需提取系数并将其作为方程进行求解:这表明方程组是欠定的,因此
a18
可以是任意的,只要a11 = a18/63
等。如果其中一个未知数没有列在解的dict中,那么它可以独立于其他未知数而取任意值我在其中添加了一个
%time
,以表明在速度不太快的计算机上解决这个问题需要244毫秒(在当前的Symphy master分支上,使用Symphy 1.8大约需要0.5秒)。请注意,我确实安装了gmpy2,它可以使Symphy中的各种事情更快。安装Symphy 1.9rc1和gmpy2(pip install pre upgrade sympy
和pip install gmpy2
)可能会加快速度。还值得注意的是,Symphy最近修复了此类系统的一些bug,因此对于其他示例,1.9可能会给出更准确的结果:https://github.com/sympy/sympy/pull/21883
您可以根据需要使用线程
下面是Corey Schäfer的解释>https://youtu.be/IEEhzQoKtQU
核心思想是并行运行代码,这意味着您的代码不会像“…计算第一个代码块…(完成)…计算第二个代码块…完成”这样。通过线程化,您的代码将同时运行多个代码块
一个好的python库是多处理库
但首先要确定您的机器可以使用多少处理器
例如,我的电脑只有4个处理器可用
这里是python中的线程示例:
上面的代码将在URL列表中循环,并输出URL的状态代码。如果没有线程,代码将以迭代的方式执行此操作。第一个URL>;状态200。。。下一个第二个URL>;状态200…下一个。。。等等
我希望我能帮你一点忙
相关问题 更多 >
编程相关推荐