[求助] 大数量的方程组求解( Python sympy),递归超过深度怎么解决 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
patrickpu
V2EX    数学

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

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

    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 条附言    173 天前
    方程组类似如下:
    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  
       173 天前
    换库,用 ortools 试试
    Sawyerhou
        2
    Sawyerhou  
       173 天前
    都是线性方程吗?是的话,直接 numpy 矩阵求解试试?
    wingkou
        3
    wingkou  
       173 天前 via Android
    等式这么多,变量才 6 个,大概率是无解的吧。除非你的等式有大量线性相关。当然,如果你的等式都是一次的,系数矩阵求逆就完事了。最好还是把你的等式(有代表性的)列一下,背景说一下。感觉更是个数学问题。
    typing
        4
    typing  
       173 天前
    你给的这个样例有很强的特征:
    线性,而且所有未知量系数都是数值而不是符号。

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


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

    样例数据中 x,y,z 开头的变量都是未知量,c 开头的都是已知量,最后的解 未知量都可以用已知量表示
    Sawyerhou
        7
    Sawyerhou  
       173 天前   1
    这不标准线性方程组,转换一下格式 numpy 秒解,把《线性代数》拿出来复习一下试试?
    Sawyerhou
        8
    Sawyerhou  
       173 天前   1
    @Sawyerhou 大概思路,对于 AX=B 形式的矩阵方程,解 X=A^-1B ,即 A 的逆左乘 B 。
    Sawyerhou
        9
    Sawyerhou  
       173 天前   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
    """
        10
    patrickpu  
    OP
       173 天前
    @Sawyerhou 已知量不是数值,c ( i,j,k,h 此类) 只是符号,方程组只是代数关系,是符号运算而不是数值运算
    patrickpu
        11
    patrickpu  
    OP
       173 天前
    @Sawyerhou thanks ,我先试一下
    Sawyerhou
        12
    Sawyerhou  
       173 天前
    @patrickpu #10 没明白你的意思,我代码里 i,j,k,h 也不是数值,解里面还是 i,j,k,h ,区别在哪?
    patrickpu
        13
    patrickpu  
    OP
       173 天前
    @Sawyerhou 理解你的意思了,第一眼没反应过来
    patrickpu
        14
    patrickpu  
    OP
       173 天前
    @Sawyerhou 拨云见日,感谢大佬
    necomancer
        15
    necomancer  
       172 天前
    不是老哥……敢情你的未知量都没在系数上?....
    necomancer
        16
    necomancer  
       172 天前
    我意思是那些处理不了的 c_i
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1199 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 17:33 PVG 01:33 LAX 09:33 JFK 12:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86