2016-04-23 4 views
1

У меня есть система уравнений ...Matlab: Решение линейной системы анонимных функций

dF(a,b,c)/da = 0; 
dF(a,b,c)/db = 0; 
dF(a,b,c)/dc = 0; 

где a, b, c неизвестные переменные константы и dF/d* анонимные функции переменных. Я должен решить для a, b и c в проблеме оптимизации. Когда система сводится к одному уравнению, я использую Matlab's fzero для решения этой переменной, и она работает. Например

var_a = fzero(@(a) dF(a)/da,0); 

После заметив, что fzero и fsolve дают совершенно разные ответы для некоторых случаев я сделал некоторый поиск. От чего я gather, fzero работает только для одного уравнения одной переменной? Поэтому, перейдя к системе уравнений, я бы хотел выбрать наиболее подходящий метод. Я использовал Matlab's solve в прошлом, но я считаю, что это только для символических выражений? Какой метод наилучшим образом метод решения линейной системы анонимных функций, которые равны нулю?

Я попытался следующие, и вернулись результаты

vars = fsolve(@(V)[dF(V)/da;dF(V)/db;dF(V)/dc],zeros(1,3)); 

где vars содержит все 3 переменные, но после прочтения примеров, приведенных в предыдущем link, Fsolve не мог точно найти нули при х^2 и х^3. Вектор решения в представленной выше системе I - это все нули, а функции - многочлены. Объединив все это, мне интересно, не fsolve - не лучший выбор?

Могу ли я построить систему звонков на fzero? Что-то вдоль линий

vars = [fzero(@(a) dF(a,b,c)/da,0); 
     fzero(@(b) dF(a,b,c)/db,0); 
     fzero(@(c) dF(a,b,c)/dc,0)]; 

, которые я не думаю, что будет работать (как бы каждый dF/d* получить другие 2 входа переменного?) Или это?

Любые мысли?

ответ

0

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

fToMinimize = @(abc) ... 
    (dF(ABC(1),ABC(2),ABC(3))/da)^2 +... 
    (dF(ABC(1),ABC(2),ABC(3))/db)^2 +... 
    (dF(ABC(1),ABC(2),ABC(3))/dc)^2 ; 

abcSolved = lsqnonlin(fToMinimize, [0 0 0]) 

Если у вас есть предположение для значений а, Ь, с, вы можете (и должны) использовать те вместо [0 0 0] вектора. В функции lsqnonlin также есть много вариантов для настройки поведения. Например, как близко к лучшему ответу, который вы хотите получить. Если функции хорошо себя ведут, вы должны сильно затянуть допуск, если вы ищете почти точный ответ.

+0

Fwiw, я раньше не использовал fsolve, но похоже, что он также может решить проблему. У Mathworks была довольно похожая настройка, 2 переменные, здесь: http://www.mathworks.com/help/optim/ug/fsolve.html – Pursuit