代码之家  ›  专栏  ›  技术社区  ›  Yoav Tarazy

拉格朗日乘数/w

  •  0
  • Yoav Tarazy  · 技术社区  · 3 年前

    我目前正试图找到一个圆的最大半径,我可以在它周围现有的圆之间体现出来。

    i、 e.我不仅要找到最大半径,还要找到在特定直线上最适合它的中心点。

    为了找到所说的最大值,我试图用Symphy实现一个广义拉格朗日乘子解。

    如果“n”代表我的约束数量,那么我能够:

    • 创建n个符号生成器。
    • 在拉格朗日函数上执行必要的第n个梯度
    • 显示所需的不等式(来自约束),以获得需要解决的等式和不等式列表。

    代码:

    from sympy import S
    from sympy import *
    import sympy as smp
    
    
    #Lagrange Multipliers
    
    def sympy_distfun(cx,cy,radius):
           
           x,y=smp.symbols('x y',real=True)
           return sqrt((x-cx)**2+(y-cy)**2)-radius
    
    def sympy_circlefun(cx,cy,radius):
           
           x,y=smp.symbols('x y',real=True)
           return (x-cx)**2+(y-cy)**2-radius**2
    
    def sympy_linefun(slope,b):
           
           x,y=smp.symbols('x y',real=True)
           return slope*x+b-y
    
    def lagrange_multiplier(objective,constraints):
         
         x,y=smp.symbols('x y',real=True)
         a=list(smp.symbols('a0:%d'%len(constraints),real=True))
         
         cons=[constraints[i]*a[i] for i in range(len(a))]
         L=objective+(-1)*sum(cons)
         gradL=[smp.diff(L,var) for var in [x,y]+a]
         constraints=[(con)>= 0 for con in constraints]
         eqs=gradL+constraints
         
         
         vars=a+[x,y]
         solution=smp.solve(eqs[0],vars)
         #solution=smp.solveset(eqs,vars)
         print(solution)
           
           
           
    line=sympy_linefun(0.66666,-4.3333)
    dist=sympy_distfun(11,3,4)
    circlefunc1=sympy_circlefun(11,3,4)
    circlefunc2=sympy_circlefun(0,0,3)
    lagrange_multiplier(dist,[line,circlefunc1,circlefunc2])
    

    但是,当使用 smp.solveset(eqs,vars) 我遇到了错误消息:

    ValueError: [-0.66666*a0 - a1*(2*x - 22) - 2*a2*x + (x - 11)/sqrt((x - 11)**2 + (y - 3)**2), a0 - a1*(2*y - 6) - 2*a2*y + (y - 3)/sqrt((x - 11)**2 + (y - 3)**2), -0.66666*x + y + 4.3333, -(x - 11)**2 - (y - 3)**2 + 16, -x**2 - y**2 + 9, 0.66666*x - y - 4.3333 >= 0, (x - 11)**2 + (y - 3)**2 - 16 >= 0, x**2 + y**2 - 9 >= 0] is not a valid SymPy expression
    

    使用时: solution=smp.solve(eqs[0],vars) 为了尝试解一个方程,它让辛皮陷入了CPU崩溃的狂热,显然无法完成计算。我确保所有变量都是实变量,所以我不明白为什么要花这么长时间来求解。

    我想了解我在用Symphy处理多重不等式时遗漏了什么,如果有一种更优化、更快的方法来解决拉格朗日乘法,我很乐意尝试一下

    0 回复  |  直到 3 年前