Ошибка оценки исходной целевой функции MATLAB - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь создать график в MATLAB, перебирая значения константы (A) относительно системы уравнений. Мой код вставлен ниже:

function F=Func1(X, A)

%X(1) is c
%X(2) is h 
%X(3) is lambda
%A is technology (some constant) 
%a is alpha

a=1;

F(1)=1/X(1)-X(3)

F(2)=X(3)*(X(1)-A*X(2)^a)

F(3)=-1/(24-X(2))-X(3)*A*a*X(2)^(a-1)

clear, clc

init_guess=[0,0,0]

for countA=1:0.01:10
    result(countA,:)=[countA,fsolve(@Func1, init_guess)] 
end


display('The Loop Has Ended') 
display(result) 
%plot(result(:,1),result(:,2))

Первый набор кодов, я определяю набор уравнений, которые я пытаюсь решить. Во втором наборе строк я пытаюсь написать al oop, который перебирает значения A, которые я хочу, [1,10] с шагом 0,01. Прямо сейчас я просто пытаюсь заставить работать мой код l oop, но продолжаю получать эту ошибку:

"Ошибка при начальной оценке целевой функции. FSOLVE не может продолжаться."

Я не уверен, почему это так. Из того, что я понимаю, это результат того, что моя исходная матрица догадок не соответствует нужному размеру, но я считаю, что она должна быть размером 3, так как я решаю для трех переменных. Кроме того, я вполне уверен, что нет ничего плохого в том, как я ссылаюсь на мой код Func1 в моем коде L oop.

Любой совет, который вы все могли бы дать, был бы искренне оценен. Я работал над MATLAB всего несколько дней, так что, если это довольно тривиальное решение, простите за мое невежество. Спасибо.

1 Ответ

2 голосов
/ 09 апреля 2020

Пара проблем с вашим кодом:

1/X(1) в функции Func1 склонен к делению на ноль просчетов. Я бы изменил его на 1/(X(1)+eps).

Если countA увеличивается на 0,01, его нельзя использовать в качестве индекса для result. Возможно, для увеличения введите индекс ind.

Я включил вашу константу A в функцию, чтобы уточнить, что такое переменные оптимизации.

Вот обновленный код. Я не знаю, являются ли результаты разумными или нет:

init_guess=[0,0,0];

ind = 1;
for countA=1:0.01:10
    result(ind,:)=[countA, fsolve(@(X) Func1(X,countA), init_guess)];
    ind = ind+1;
end

display('The Loop Has Ended')
display(result) 
%plot(result(:,1),result(:,2))

function F=Func1(X,A)

%X(1) is c
%X(2) is h 
%X(3) is lambda
%A is technology (some constant) 
%a is alpha

a=1;

F(1)=1/(X(1)+eps)-X(3);

F(2)=X(3)*(X(1)-A*X(2)^a);

F(3)=-1/(24-X(2))-X(3)*A*a*X(2)^(a-1);

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...