在 Octave 中最小化具有有限变量的线性方程组

问题描述

我已经搜索了 Octave 资源、优化 pdf 以及这里的许多问题,但我似乎无法找到或理解正确的解决方案。我试图找到一种纠正解决方案来移动一组数据点以紧密匹配另一组数据。使用的方程是带有交叉项的二次方程,即 ax^2 +bx +c + d*y = x',其中 x 来自一个数据集,x' 来自另一个数据集。 y 坐标也有类似的方程。

我根据数据确定了 x 和 y 值,并尝试优化系数以最小化所有点之间的平方和误差。现在,我只是想通过 ax^2 +bx +c + d*y - x' = 0 来最小化 x 和 x' 之间的差异。我会尝试这样做以后所有方程的平方和,除非这里有人也能帮我解决这个问题。

我尝试过使用 fminuncfminsearch,由于矩阵大小的原因,在几次迭代后都出现错误。我不认为这些解决方案喜欢方程多于变量。我不认为 qpglpk 是有用的解决方案。

这是我试图最小化的方程组的一个例子。未来的迭代可能有多达 32 个方程,但变量/系数的数量相同。

function zer = fcn(coeff)
zer = zeros(18,1);
   zer(1) = coeff(1)*19.338458^2 + coeff(2)*19.338458 + coeff(3) + coeff(4)*17.806945 - 23.200000;
   zer(2) = coeff(1)*-0.146987^2 + coeff(2)*-0.146987 + coeff(3) + coeff(4)*2.273490 - 2.900000;
   zer(3) = coeff(1)*-18.333520^2 + coeff(2)*-18.333520 + coeff(3) + coeff(4)*-19.133048 - -15.700000;
   zer(4) = coeff(1)*-24.447818^2 + coeff(2)*-24.447818 + coeff(3) + coeff(4)*2.146905 - -21.700000;
   zer(5) = coeff(1)*0.363997^2 + coeff(2)*0.363997 + coeff(3) + coeff(4)*27.305928 - 3.500000;
   zer(6) = coeff(1)*15.042656^2 + coeff(2)*15.042656 + coeff(3) + coeff(4)*-15.456741 - 18.800000;
   zer(7) = coeff(1)*18.529375^2 + coeff(2)*18.529375 + coeff(3) + coeff(4)*1.046316 - 22.100000;
   zer(8) = coeff(1)*0.045810^2 + coeff(2)*0.045810 + coeff(3) + coeff(4)*-21.082700 - 3.300000;
   zer(9) = coeff(1)*-18.499911^2 + coeff(2)*-18.499911 + coeff(3) + coeff(4)*22.048530 - -15.700000;
   zer(10) = coeff(5)*17.806945^2 + coeff(6)*17.806945 + coeff(7) + coeff(8)*19.338458 - 16.000000;
   zer(11) = coeff(5)*2.273490^2 + coeff(6)*2.273490 + coeff(7) + coeff(8)*-0.146987 - 0.300000;
   zer(12) = coeff(5)*-19.133048^2 + coeff(6)*-19.133048 + coeff(7) + coeff(8)*-18.333520 - -21.400000;
   zer(13) = coeff(5)*2.146905^2 + coeff(6)*2.146905 + coeff(7) + coeff(8)*-24.447818 - 0.400000;
   zer(14) = coeff(5)*27.305928^2 + coeff(6)*27.305928 + coeff(7) + coeff(8)*0.363997 - 25.700000;
   zer(15) = coeff(5)*-15.456741^2 + coeff(6)*-15.456741 + coeff(7) + coeff(8)*15.042656 - -18.300000;
   zer(16) = coeff(5)*1.046316^2 + coeff(6)*1.046316 + coeff(7) + coeff(8)*18.529375 - -1.100000;
   zer(17) = coeff(5)*-21.082700^2 + coeff(6)*-21.082700 + coeff(7) + coeff(8)*0.045810 - -23.200000;
   zer(18) = coeff(5)*22.048530^2 + coeff(6)*22.048530 + coeff(7) + coeff(8)*-18.499911 - 20.200000;
endfunction

解决方法

评论中的 Erwin 和 Cris 100% 正确。

这里需要做的就是将其转换为带有答案向量的矩阵。

best_solution = 矩阵\answer_vector;

令人尴尬的是我把问题复杂化了。