Fsolve с переменными из других массивов

У меня есть следующая функция:

function F = F(x,L,Kc1,Kc2,Kc3,Kc4)
F=[(2*L*x(1)^2)/Kc1 + L*x(1)*x(2)/Kc3 + x(1)+ (x(1)*Kc4/L)^0.5 - (2*(0.235)); (2*L*(x(2)^2))/Kc2 + x(2)+ L*x(1)*x(2)/Kc3 -2*(0.765)];
end

Здесь L,Kc1,Kc2,Kc3 and Kc4 — это массивы, в которых уже хранится 99 числовых значений. Таким образом, мне нужно решить x(1) and x(2) 99 раз и сохранить их в массивах O2 и N2. Для этого код такой:

x0=[-5 -5];
O2=zeros(1,99);
N2=zeros(1,99);
for i=1:1:99
    x=fsolve(@(x)F(x,L(i),Kc1(i),Kc2(i),Kc3(i),Kc4(i)),x0);
    O2(i)=x(1);
    N2(i)=x(2);
end

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

??? Error using ==> vertcat
CAT arguments dimensions are not consistent.

Error in ==> F at 2
F=[(2*L*(x(1)^2))/Kc1 + L*x(1)*x(2)/Kc3 + x(1)+ (x(1)*Kc4/L)^0.5 - (2*(0.235)); (2*L*(x(2)^2))/Kc2 +
x(2)+ L*x(1)*x(2)/Kc3 -2*(0.765)];

Error in ==> @(x)F(x,L(i),Kc1(i),Kc2(i),Kc3(i),Kc4(i))


Error in ==> fsolve at 254
            fuser = feval(funfcn{3},x,varargin{:});

Error in ==> Air_equilibriuw at 76
   x=fsolve(@(x)F(x,L(i),Kc1(i),Kc2(i),Kc3(i),Kc4(i)),x0);

Caused by:
    Failure in initial user-supplied objective function evaluation. FSOLVE cannot continue.

Кто-нибудь знает, что случилось? Заранее спасибо.


person Ananth Saran    schedule 27.04.2013    source источник
comment
Я считаю 6 входов в F(), но вы передаете 7 входов, включая дополнительный x0. Проверьте скобки.   -  person Oleg    schedule 27.04.2013
comment
Я изменил скобки. Я все еще получаю ошибку, но новую. Я отредактировал комментарий. Спасибо за помощь.   -  person Ananth Saran    schedule 27.04.2013
comment
Проверьте деление и умножение на L в составном выражении. Используйте dbstop if error, затем запустите свой код. Когда закончите dbclear if error.   -  person Oleg    schedule 27.04.2013
comment
Я узнал ошибку. Между двумя функциями, используемыми в F, должна была стоять запятая, а не точка с запятой. F=[(2*Lx(1)^2)/Kc1 + Lx(1)*x(2)/Kc3 + x(1)+ (x(1)*Kc4/ L)^0,5 - (2*(0,235)), (2*L*(x(2)^2))/Kc2 + x(2)+ L*x(1)*x(2)/Kc3 -2 *(0,765)];   -  person Ananth Saran    schedule 28.04.2013


Ответы (1)


Сдача

function F = F(x,L,Kc1,Kc2,Kc3,Kc4)
    F=[(2*L*x(1)^2)/Kc1 + L*x(1)*x(2)/Kc3 + x(1)+ (x(1)*Kc4/L)^0.5 - (2*(0.235)); (2*L*(x(2)^2))/Kc2 + x(2)+ L*x(1)*x(2)/Kc3 -2*(0.765)];
end

to

function F = F(x,L,Kc1,Kc2,Kc3,Kc4)
    F=[(2*L*x(1)^2)/Kc1 + L*x(1)*x(2)/Kc3 + x(1)+ (x(1)*Kc4/L)^0.5 - (2*(0.235)), (2*L*(x(2)^2))/Kc2 + x(2)+ L*x(1)*x(2)/Kc3 -2*(0.765)];
end

Теперь F будет иметь размер [2 x 1] вместо [1 x 2], и ваша ошибка vertcat исчезнет.

person JesseBikman    schedule 16.05.2013