Следующий код работает нормально и дает точный результат.
c1 ... c5 - известные константы, а x (1) ... x (5) (анонимный вектор) - неизвестные переменные, которые длябыть приспособленным fminsearch
, используя метод наименьших квадратов.(t, y) - данные (кривая) для соответствия уравнению, myfunc
- это функция ode45
, сохраненная в отдельном файле .m.
% run the solver
options = optimset('MaxFunEvals',10000,'MaxIter',10000,'Display','iter');
[x,fval,exitflag,output] = fminsearch(@(x) Obj(x,initial_p,c1,c2,c3,c4,c5,c6,t,y),x0,options);
function F = Obj(x,initial_p,c1,c2,c3,c4,c5,c6,t,y)
p = myfunc(x(2:end),initial_p,t,c1,c4);
yt = mainfunc(x,p,c1,c2,c3,c4,c5,c6);
F = sqrt(sum((yt-y).^2));
disp(x);
end
function yt = mainfunc(x,p,c1,c2,c3,c4,~,~)
yf = c1*c2*c3*c4*sqrt(p);
yt = x(1)+yf;
end
Но возникает ошибка (Assignment has more non-singleton rhs dimensions than non-singleton subscripts
) когда я переписываю mainfunc
(все остальное тоже самое):
function yt = mainfunc(x,p,c1,c2,c3,c4,c5,c6)
ys = c1*c3*(c5/(c6*sqrt(p)));
yf = c1*c2*c3*c4*sqrt(p);
yt = x(1)+ys+yf;
end
p - это кривая (t, p), исходящая из ode45
в myfunc
, она отлично работает в первой версиикода, так что никаких проблем нет.Вызывает ли проблема наличие двух терминов с sqrt (p) в mainfunc
?