일부 데이터에는 ODE 시스템을 사용하여 곡선을 맞추려고합니다. ODE 시스템은 사전 정의 된 시점에 따라 다른 ODE 시스템으로 변경됩니다.ODE의 방정식이 변경되는 ODE가 필요합니다.
다음은 간단한 예입니다.
function examplefitting
init = [1];
expdata = [10;40;70;76;80;90;101;110;150;180;200;202;215;240;245]';
time = [5;10;15;20;25;30;35;40;50;55;60;65;70;75;80]';
[x,resnorm] = lsqcurvefit(@data,init,time,expdata);
function z = data(init,time)
alpha = init(1);
y0 = 100;
tout = [];
yout = [];
for i = 2:5
tvec = [0 15 30 50 65];
u = [1 0 1 0 1];
[t y] = ode23s(@Model,[tvec(i-1) tvec(i)],y0,[],alpha,u(i-1));
nt = length(t);
tout = [tout;t];
yout = [yout;y];
y0 = [y(nt,1)];
end
z = yout;
function Y = Model(t,y,alpha,u)
if u == 0
Y(1) = y(1).^alpha;
elseif u == 1
Y(1) = alpha*y(1);
end
Y = Y.';
당신은 내가 통합을 중지하고 재설정해야하기 때문에, 출력의 길이 및 내 원래의 데이터 입력의 길이가 다른 것을 볼 수 있습니다. 이로 인해 "함수 값과 YDATA 크기가 일치하지 않습니다."라는 오류가 발생합니다. 시간에 따라 전환되는 두 가지 ODES 시스템에 나타나면 최상의 맞춤 알파를 추출 할 수있는 방법이 있습니까?
'data' 함수는'time' 입력을 사용하지 않습니다. 총 통합 시간을 결정하기 위해'lsqcurvefit'에 전달 된 벡터'time'에 대한 아이디어가'data'로 전달 될까요? 또한 불필요한 줄 바꿈을 모두 제거하기 위해 코드를 정리하면 도움이됩니다. – horchler
작성된대로 아닙니다. 나는 lsqcurvefit을 각 tvec (i-1)에서 tvec (i)까지만 맞추면 각 시간 세그먼트에 가장 적합한 알파를 얻을 수 있다고 생각했다. 대신, 전 시간 범위에 걸쳐 가장 적합한 알파를 얻고 싶습니다. 나는이 주석이 당신의 질문을 적절하게 다루지 않는다고 생각하니? – Tim
아무 것도 유용하게 사용하려면 적어도'lsqcurvefit'의 요구 사항에 해당하는'data' 함수가 필요하다고 생각합니다. 그것이 그 질문에 관한 것입니까? 그러면'init'과'time'은'X0'과'XDATA'에 해당합니다. 'data'의 결과는'XDATA' /'time'과 같은 길이가되어야합니다. – horchler