OP 有个需求,需要计算大数量(成千上万)的方程组,方程数量在 1000 以内都能成功计算,更大就会报递归错误。
使用的是 python 的 sympy 库:
equations = [sympy.Eq("c1+y2-2z2-c3", "x1"), sympy.Eq("c2+y1-2z1+c3", "x2")....] # 数量成千上万
unknowns = [x1, y1, z1, x2, y2, z2]
sympy.solve(equations, unknowns)
递归深度错误:
RecursionError: maximum recursion depth exceeded while calling a Python object
通过设置 sys.setrecursionlimit(1000000)
只能治标不治本。
求助广大的 v 友,是否有其他的方式分布式并行运算方案。
![]() |
1
ma46 90 天前
换库,用 ortools 试试
|
![]() |
2
Sawyerhou 90 天前
都是线性方程吗?是的话,直接 numpy 矩阵求解试试?
|
![]() |
3
wingkou 90 天前 via Android
等式这么多,变量才 6 个,大概率是无解的吧。除非你的等式有大量线性相关。当然,如果你的等式都是一次的,系数矩阵求逆就完事了。最好还是把你的等式(有代表性的)列一下,背景说一下。感觉更是个数学问题。
|
![]() |
4
typing 90 天前
你给的这个样例有很强的特征:
线性,而且所有未知量系数都是数值而不是符号。 如果你所有的数据都满足这个特征,尝试先做 sparse numerical decomposition ,然后再做一遍 symbolic back substitution. 即使你全部数据没有这个特征,那也试试其他符号求解器。我觉得一万这个量级不至于爆栈,甚至不应该有显式递归。大概率是 sympy 的锅 |
![]() |
6
patrickpu OP |
![]() |
7
Sawyerhou 90 天前 ![]() 这不标准线性方程组,转换一下格式 numpy 秒解,把《线性代数》拿出来复习一下试试?
|
![]() |
9
Sawyerhou 90 天前 ![]() import numpy as np
""" 原方程组: 6x+10y+5z+12u-12i-7j-10k-14h=0 11x+y+8z+7u-8i-j-9k-11h=0 13x+9y+3z+4u-2i-13j-15k-5h=0 14x+15z+2u-6i-3k-4h=0 已知:i,j,k,h 且解一定存在 求解:x,y,z,u 将已知量挪到等号右侧: 6x+10y+5z+12u=12i+7j+10k+14h 11x+y+8z+7u=8i+j+9k+11h 13x+9y+3z+4u=2i+13j+15k+5h 14x+15z+2u=6i+3k+4h 转为 numpy 矩阵: """ a = [[6, 10, 5, 12], [11, 1, 8, 7], [13, 9, 3, 4], [14, 0, 15, 2]] b = [[12, 7, 10, 14], [8, 1, 9, 11], [2, 13, 15, 5], [6, 0, 3, 4]] an, bn = np.array(a), np.array(b) x = np.linalg.solve(an, bn) print("解:\n", x) """ 解: [[-0.21755027 0.52010969 1.1142596 0.23765996] [-0.04286004 0.97735121 0.11121268 -0.36867764] [ 0.47694495 -0.44464757 -0.91529555 -0.14381475] [ 0.94576478 -0.30591103 0.56489945 1.41499086]] 转回字符格式: x=-0.21755027i+0.52010969j+1.1142596k+0.23765996h y=-0.04286004i+0.97735121j+0.11121268k-0.36867764h z=0.47694495i-0.44464757j-0.91529555k-0.14381475h w=0.94576478i-0.30591103j+0.56489945k+1.41499086h """ |
![]() |
15
necomancer 88 天前
不是老哥……敢情你的未知量都没在系数上?....
|
![]() |
16
necomancer 88 天前
我意思是那些处理不了的 c_i
|