Как решить переопределенный набор уравнений, используя нелинейный метод наименьших квадратов в Matlab

A11 = cos(x)*cos(y)                           (1)
A12 = cos(x)*sin(y)                           (2)
A13 = -sin(y)                                 (3)
A21 = sin(z)*sin(x)*cos(y) - cos(z)*sin(y)    (4)
A22 = sin(z)*sin(y)*sin(x) + cos(z)*cos(y)    (5)
A23 = cos(x)*sin(z)                           (6)
A31 = cos(z)*sin(x)*cos(z) + sin(z)*sin(x)    (7)
A32 = cos(z)*sin(x)*sin(y) - sin(z)*cos(y)    (8)
A33 = cos(x)*cos(z)                           (9)

У меня есть набор из девяти уравнений и только три неизвестных. Неизвестными являются x, y и z. Я знаю значения A11, A12, A13......A33. Но эти значения могут иметь некоторый шум, и поэтому мне придется использовать некоторый алгоритм оптимизации, чтобы найти наиболее подходящие значения x, y и z.

Как решить приведенный выше набор переопределенных уравнений в Matlab?

Я искал в Интернете и наткнулся на несколько функций, в первую очередь на эту one .

Но я очень смущен тем, как лучше всего подойти к проблеме. Нужно небольшое направление....


person Black Dagger    schedule 24.06.2014    source источник
comment
доступен ли набор инструментов оптимизации?   -  person Daniel    schedule 24.06.2014
comment
@ Даниэль Да. У меня есть это.   -  person Black Dagger    schedule 24.06.2014


Ответы (1)


Мне больше всего нравится lsqcurvefit из набора инструментов для оптимизации.

Из документации видно, что для этого требуется:

  • ручка функции (весело)
  • начальные значения параметров (x0)
  • дополнительные неподходящие параметры (xdata), которых в вашем случае не существует
  • значения данных (ydata)

Параметры могут быть установлены optimset, где вы можете указать один из нескольких проверенных алгоритмов. Также здесь можно установить максимальное количество итераций или минимальный порог допуска функции или значения параметра.


Если случайно у вас нет инструментов оптимизации, вы всегда можете использовать fminsearch и минимизировать метод наименьших квадратов sum((ydata-fun(x)).^2) напрямую.


И пример написания функции fun (см. также документацию) в этом случае здесь и с использованием кода из вопроса:

function r = fun(p, xdata)
x = p(1);
y = p(2);
z = p(3);

% code from here
A11 = cos(x)*cos(y)
A12 = cos(x)*sin(y)
A13 = -sin(y)
A21 = sin(z)*sin(x)*cos(y) - cos(z)*sin(y)
A22 = sin(z)*sin(y)*sin(x) + cos(z)*cos(y)
A23 = cos(x)*sin(z)
A31 = cos(z)*sin(x)*cos(z) + sin(z)*sin(x)
A32 = cos(z)*sin(x)*sin(y) - sin(z)*cos(y)
A33 = cos(x)*cos(z)

% everything in one matrix
r = [A11, A12, A13, A21, A22, A23, A31, A32, A33];
end

Видно, что нет реальной разницы между скалярной и векторнозначной функцией. Matlab автоматически вычисляет разницу данных и суммирует их.

person Trilarion    schedule 24.06.2014
comment
Я не понимаю, как написать прикол(х). Поскольку у меня есть 9 уравнений, как мне написать свою функцию? Не могли бы вы просто отредактировать свой ответ, чтобы показать это? - person Black Dagger; 26.06.2014
comment
@BlackDagger Конечно. Я добавил пример и отредактировал ответ. - person Trilarion; 26.06.2014