Решение системы нелинейных уравнений в MATLAB с помощью fsolve

У меня есть код, который создает вектор в MATLAB, например, это трехкомпонентный вектор (n=3):

a1_1 - sin((17*a1_1)/60 + a2_1/8 + a3_1/40 - 0.153233)
(15*a1_1)/16 + a2_1/4 + a3_1/32 - sin((17*a1_1)/60 + a2_1/8 + a3_1/40 - 0.0282326)
(3*a1_1)/4 + a2_1/2 + a3_1/8 - sin((17*a1_1)/60 + a2_1/8 + a3_1/40 + 0.846767)

как вы можете видеть, каждый компонент представляет собой нелинейное уравнение. Три компонента вектора образуют систему трех нелинейных уравнений, переменные которых имеют имена a1_1, a1_2 и a1_3. Я хочу решить эту систему с помощью fsolve.

Как это сделать для произвольного n?


person NoMan    schedule 03.08.2015    source источник


Ответы (2)


Чтобы использовать fsolve, ваша функция должна принимать векторный ввод и возвращать вектор такого же размера. В вашем случае это можно сделать с помощью анонимной функции:

f = @(a)[a(1) - sin(17*a(1)/60 + a(2)/8 + a(3)/40 - 0.153233);...
         15*a(1)/16 + a(2)/4 + a(3)/32 - sin(17*a(1)/60 + a(2)/8 + a(3)/40 - 0.0282326);...
         3*a(1)/4 + a(2)/2 + a(3)/8 - sin(17*a(1)/60 + a(2)/8 + a(3)/40 + 0.846767)];
n = 3;
a0 = zeros(n,1); % Initial guess
opts = optimoptions('fsolve','Display','iter','TolFun',1e-8);
[a_sol,a_val,exitflag] = fsolve(f,a0,opts)

Это возвращает

a_sol =

  -0.002818738864459
  -0.687953796565011
   9.488284986072076

Конечно, может быть несколько решений, особенно для больших n. Вы можете выбрать исходное предположение, чтобы найти остальные. См. Документацию для fsolve и optimoptions для получения дополнительных сведений об указании параметров.

person horchler    schedule 03.08.2015

Вы пробовали использовать команду solve?

[y1, ..., yN] = решать (eqns, vars) решает систему уравнений eqns для переменных vars. Решения ставятся в соответствие переменным y1, ..., yN. Если вы не укажете переменные, функция решения использует символическую переменную, чтобы найти переменные для поиска. В этом случае количество переменных, которые находит symvar, равно количеству выходных аргументов N.

person Peut22    schedule 03.08.2015
comment
Этот ответ низкого качества и не более чем комментарий. Кроме того, OP спрашивает о решении системы (которая может быть довольно большой) численно. solve - это символьный математический метод. Из-за природы некоторых параметров в уравнениях маловероятно, что solve сможет получить символическое решение. Скорее всего, он обратится к числовому, и в этом случае fsolve, вероятно, будет лучшим и гораздо более быстрым вариантом. - person horchler; 03.08.2015