[求助] 大数量的方程组求解( Python sympy),递归超过深度怎么解决

96 天前
 patrickpu

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 友,是否有其他的方式分布式并行运算方案。

1408 次点击
所在节点    数学
16 条回复
ma46
96 天前
换库,用 ortools 试试
Sawyerhou
96 天前
都是线性方程吗?是的话,直接 numpy 矩阵求解试试?
wingkou
96 天前
等式这么多,变量才 6 个,大概率是无解的吧。除非你的等式有大量线性相关。当然,如果你的等式都是一次的,系数矩阵求逆就完事了。最好还是把你的等式(有代表性的)列一下,背景说一下。感觉更是个数学问题。
typing
96 天前
你给的这个样例有很强的特征:
线性,而且所有未知量系数都是数值而不是符号。

如果你所有的数据都满足这个特征,尝试先做 sparse numerical decomposition ,然后再做一遍 symbolic back substitution.


即使你全部数据没有这个特征,那也试试其他符号求解器。我觉得一万这个量级不至于爆栈,甚至不应该有显式递归。大概率是 sympy 的锅
patrickpu
96 天前
@Sawyerhou 是线性方程,但都是符号方程,不是值计算
patrickpu
96 天前
@wingkou @typing 一定是有解的,是线性符号方程,是个数学理论问题的验证,公式数量小范围内程序都可以解出来,只是越大越慢,超过 1k 就力不从心了

样例数据中 x,y,z 开头的变量都是未知量,c 开头的都是已知量,最后的解 未知量都可以用已知量表示
Sawyerhou
96 天前
这不标准线性方程组,转换一下格式 numpy 秒解,把《线性代数》拿出来复习一下试试?
Sawyerhou
96 天前
@Sawyerhou 大概思路,对于 AX=B 形式的矩阵方程,解 X=A^-1B ,即 A 的逆左乘 B 。
Sawyerhou
95 天前
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
"""
patrickpu
95 天前
@Sawyerhou 已知量不是数值,c ( i,j,k,h 此类) 只是符号,方程组只是代数关系,是符号运算而不是数值运算
patrickpu
95 天前
@Sawyerhou thanks ,我先试一下
Sawyerhou
95 天前
@patrickpu #10 没明白你的意思,我代码里 i,j,k,h 也不是数值,解里面还是 i,j,k,h ,区别在哪?
patrickpu
95 天前
@Sawyerhou 理解你的意思了,第一眼没反应过来
patrickpu
95 天前
@Sawyerhou 拨云见日,感谢大佬
necomancer
94 天前
不是老哥……敢情你的未知量都没在系数上?....
necomancer
94 天前
我意思是那些处理不了的 c_i

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1136726

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX