V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
patrickpu
V2EX  ›  数学

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

  •  
  •   patrickpu · 90 天前 · 1355 次点击
    这是一个创建于 90 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 条附言  ·  90 天前
    方程组类似如下:
    x1 + y1 + z2 + c1 ... = 0
    x2 + 2y3 + z1 -5c2 ... = 0
    x3 - 5y1 + z3 + c2 ... = 0
    x4+ 2y3 + z1 -5c2 ... = 0
    x1 + y1 + z2 + c1 ... = 0
    x2 + 2y3 + z1 -5c2 ... = 0
    ...

    其中 x,y,z 开头的变量都是未知量,c 开头的都是已知量,最后的解一定是未知量都可以用已知量表示

    sympy 使用了递归,当方程组数量一多就没办法了
    16 条回复    2025-06-07 21:51:16 +08:00
    ma46
        1
    ma46  
       90 天前
    换库,用 ortools 试试
    Sawyerhou
        2
    Sawyerhou  
       90 天前
    都是线性方程吗?是的话,直接 numpy 矩阵求解试试?
    wingkou
        3
    wingkou  
       90 天前 via Android
    等式这么多,变量才 6 个,大概率是无解的吧。除非你的等式有大量线性相关。当然,如果你的等式都是一次的,系数矩阵求逆就完事了。最好还是把你的等式(有代表性的)列一下,背景说一下。感觉更是个数学问题。
    typing
        4
    typing  
       90 天前
    你给的这个样例有很强的特征:
    线性,而且所有未知量系数都是数值而不是符号。

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


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

    样例数据中 x,y,z 开头的变量都是未知量,c 开头的都是已知量,最后的解 未知量都可以用已知量表示
    Sawyerhou
        7
    Sawyerhou  
       90 天前   ❤️ 1
    这不标准线性方程组,转换一下格式 numpy 秒解,把《线性代数》拿出来复习一下试试?
    Sawyerhou
        8
    Sawyerhou  
       90 天前   ❤️ 1
    @Sawyerhou 大概思路,对于 AX=B 形式的矩阵方程,解 X=A^-1B ,即 A 的逆左乘 B 。
    Sawyerhou
        9
    Sawyerhou  
       90 天前   ❤️ 1
    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
        10
    patrickpu  
    OP
       90 天前
    @Sawyerhou 已知量不是数值,c ( i,j,k,h 此类) 只是符号,方程组只是代数关系,是符号运算而不是数值运算
    patrickpu
        11
    patrickpu  
    OP
       90 天前
    @Sawyerhou thanks ,我先试一下
    Sawyerhou
        12
    Sawyerhou  
       90 天前
    @patrickpu #10 没明白你的意思,我代码里 i,j,k,h 也不是数值,解里面还是 i,j,k,h ,区别在哪?
    patrickpu
        13
    patrickpu  
    OP
       90 天前
    @Sawyerhou 理解你的意思了,第一眼没反应过来
    patrickpu
        14
    patrickpu  
    OP
       90 天前
    @Sawyerhou 拨云见日,感谢大佬
    necomancer
        15
    necomancer  
       88 天前
    不是老哥……敢情你的未知量都没在系数上?....
    necomancer
        16
    necomancer  
       88 天前
    我意思是那些处理不了的 c_i
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3907 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:17 · PVG 18:17 · LAX 03:17 · JFK 06:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.