2016-02-19 1 views
0

На самом деле мне приходится вычислять значения 3 переменных из, вероятно, 8 или 9 нелинейных уравнений (может быть больше для точности).Решение по определенному нелинейному уравнению в matlab

Я использовал lsqnonlin и fsolve. Используя lsqnonlin, он говорит, что решатель остановлен преждевременно (в основном из-за значения итерации, funEvals и допуска), а выход находится далеко от точного решения. Я попытался, но не знаю, на каком основании я должен установить эти параметры.

Использование fsolve говорит, что решение не найдено.

Я также использовал LMFnlsq и LMFsolve, но он не дает выхода нигде рядом с точным решением? Я также попытался изменить другие параметры, но я не смог довести эти решения до моих желаемых значений.

Есть ли другой способ решения этих переопределенных нелинейных уравнений?

Мой код до сих пор:

x0 = [20 40 275]; 

eqn = @(x)[((((x(1)-Sat(1,1))^2+(x(2)-Sat(1,2))^2+(x(3)-Sat(1,3))^2))-dis(1)^2); 
    ((((x(1)-Sat(2,1))^2+(x(2)-Sat(2,2))^2+(x(3)-Sat(2,3))^2))-dis(2)^2); 
    ((((x(1)-Sat(3,1))^2+(x(2)-Sat(3,2))^2+(x(3)-Sat(3,3))^2))- dis(3)^2);  
    ((((x(1)-Sat(4,1))^2+(x(2)-Sat(4,2))^2+(x(3)-Sat(4,3))^2))- dis(4))^2;  
    ((((x(1)-Sat(5,1))^2+(x(2)-Sat(5,2))^2+(x(3)-Sat(5,3))^2))- dis(5))^2;  
    ((((x(1)-Sat(6,1))^2+(x(2)-Sat(6,2))^2+(x(3)-Sat(6,3))^2))- dis(6))^2;  
    ((((x(1)-Sat(7,1))^2+(x(2)-Sat(7,2))^2+(x(3)-Sat(7,3))^2))- dis(7))^2;  
    ((((x(1)-Sat(8,1))^2+(x(2)-Sat(8,2))^2+(x(3)-Sat(8,3))^2))- dis(8))^2;  
    ((((x(1)-Sat(9,1))^2+(x(2)-Sat(9,2))^2+(x(3)-Sat(9,3))^2))- dis(9))^2;  
    ((((x(1)-Sat(10,1))^2+(x(2)-Sat(10,2))^2+(x(3)-Sat(10,3))^2))- dis(10))^2]; 

lb = [0 0 0]; 
ub = [100 100 10000]; 

options = optimoptions('lsqnonlin','MaxFunEvals',3000,'MaxIter',700,'TolFun',1e-18);%,'TolX',1); 

x= lsqnonlin(eqn,x0,lb,ub,options) 

**Error:** 

**Solver stopped prematurely.** 

lsqnonlin stopped because it exceeded the iteration limit, 
options.MaxIter = 700 (the selected value). 


x = 20.349  46.633  9561.5 

Надеясь для некоторых предложений!

Заранее благодарен!

+0

Покажите нам, что вы пробовали. Невозможно предложить вещи, если мы не видели, что вы пробовали до сих пор. – rayryeng

+0

Вы * можете * получить лучший ответ на http://math.stackexchange.com/ – RoadieRich

+0

Я добавил код, который я сделал. Надеюсь, это сработает @rayryeng – Prajan

ответ

0

Я обычно эта модель явно:

min w'w 
f_i(x) = w_i 
w is a free variable 
L<=x<=U 

Это должно быть легко рассчитать допустимое (но неоптимальное) решение заранее. Если вы можете найти «хорошее» начальное решение, которое было бы еще лучше. Затем используйте решатель NLP общего назначения (например, fmincon) и передайте исходное выполнимое решение (оба: x и w). Лучше всего использовать систему моделирования, которая позволяет автоматически дифференцировать. В противном случае вы должны предоставить правильные и точные градиенты (и, если необходимо, второстепенные производные). См. Также совет here.

Смежные вопросы