如何为scipy.optimize指定约束列表?

时间:2016-02-28 12:04:00

标签: python scipy

我正在努力从优化手册中找出如何做到这一点 (使用最小化例程SLSQP)。我的问题有一系列变量x0,我试图为我的函数构建一个约束列表。

float f = 10;

约束必须是以下形式:ff [x,y,1] ** 2 + ff [x,y,2] ** 2 + ... + ff [x,y,N] ** 2 = 1

我认为这应该是可行的,但我正在学习Python,因为我解决了这个问题。我希望它不会成为一个琐碎的地方。我到目前为止的尝试,

float f = 10.1f;

现在,

        #region circle detection
        Stopwatch watch = Stopwatch.StartNew();
        double cannyThreshold = 100.0;
        double circleAccumulatorThreshold = 80;
        CircleF[] circles = CvInvoke.HoughCircles(uimage, HoughType.Gradient, 2.0, 20.0, cannyThreshold, circleAccumulatorThreshold, 5);

        watch.Stop();
        msgBuilder.Append(String.Format("Hough circles - {0} ms; ", watch.ElapsedMilliseconds));
        #endregion

        imgOriginal.Image = img;
        this.Text = msgBuilder.ToString();

        #region draw circles
        Image<Bgr, Byte> circleImage = img.CopyBlank();

        foreach (CircleF circle in circles)
        {
            circleImage.Draw(circle, new Bgr(Color.Brown), 2);
        }
        imgDetect.Image = circleImage;

但是我收到了错误,#34;数组的索引太多了#34;

1 个答案:

答案 0 :(得分:0)

我认为您的代码存在的问题是它会覆盖约束cons。因此,scipy.optimize.minimize函数看到的唯一约束是np.sum(np.abs(ff[-1, -1, :])**2) = 1,其中-1表示最后一个元素L-1。我建议初始化一个空列表,然后附加到它:

    cons = []
    for i_x in range(L):
        for i_y in range(L):
            cons.append({'type':'eq', 'fun': ...)

第二个问题是约束必须通过与您尝试最小化的函数相同的向量进行参数化,即它必须是具有形状(L * L * N * 2,)的向量的函数。你的是ff的函数,它具有形状(L,L,N,)并且是一个常数(&#34;冻结&#34;在创建时具有初始值x0),不依赖于最小化算法的当前迭代。