我目前正试图找到一个圆的最大半径,我可以在它周围现有的圆之间体现出来。
i、 e.我不仅要找到最大半径,还要找到在特定直线上最适合它的中心点。
为了找到所说的最大值,我试图用Symphy实现一个广义拉格朗日乘子解。
如果“n”代表我的约束数量,那么我能够:
-
创建n个符号生成器。
-
在拉格朗日函数上执行必要的第n个梯度
-
显示所需的不等式(来自约束),以获得需要解决的等式和不等式列表。
代码:
from sympy import S
from sympy import *
import sympy as smp
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)
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处理多重不等式时遗漏了什么,如果有一种更优化、更快的方法来解决拉格朗日乘法,我很乐意尝试一下