2014-10-16 2 views
0

Мне нужно решить систему нелинейных уравнений; для использования fsolve, я написал m-файл, содержащий мою функцию «myfun». Эта функция вызывается основным m-файлом.matlab: использование вектора неизвестных в fsolve

Как система, так и неизвестные должны быть записаны с использованием цикла «для».

Пример:

function F=myfun(x) 
n=20;` 
for j=1:n 
    c1=sqrt(x(j)^2-3*x(j)); 
    c2=x(j)^(1/2); 
F(j)=c1+c2; 
end 

Моя проблема заключается в том, что я должен заранее выделить память для моих векторов, как Р и х, в противном случае решатель считает numel (х) = 1. Но если я объявляю

F=zeros(n,1); 
x=zeros(n,1); 

У меня есть следующий вывод:

No solution found. 
fsolve stopped because the problem appears regular as measured by the gradient, 
but the vector of function values is not near zero as measured by the 
default value of the function tolerance. 

Любые предложения? Благодаря

ответ

0

Вам не нужно цикл, просто использовать

F = sqrt(x.^2-3*x) + x.^(1/2); 

Тогда вы также не нужно объявлять п, c1, c2.

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

+0

Использование его в 'fsolve' требует от него функции, поэтому я бы предпочел анонимную функцию' fun = @ (x) sqrt (x.^2-3 * x) + sqrt (x) '. – MeMyselfAndI

+0

Да, F все равно должен находиться внутри функции, как в OP. Анонимная функция - хорошая альтернатива. – jacob

+0

Собственно, пример, который я опубликовал, не подходит; Я упростил проблему. Мой код походит, что более или менее: F = myfun (х) для я = 1: 20 J = 4 + I , если я> 2 && г <20 Р (к) = x (i) * (1-sqrt (x (i))) + x (i-2) * (1-sqrt (x (i-2))) + x (i + 1) * (1- sqrt (х (г + 1))); elseif i == 1 F (j) = x (i) * (1-sqrt (x (i))) + x (i + 1) * (1-sqrt (x (i + 1))); ElseIf ... конец конец –

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