2013-12-11 2 views
1

일부 데이터에는 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 시스템에 나타나면 최상의 맞춤 알파를 추출 할 수있는 방법이 있습니까?

+0

'data' 함수는'time' 입력을 사용하지 않습니다. 총 통합 시간을 결정하기 위해'lsqcurvefit'에 전달 된 벡터'time'에 대한 아이디어가'data'로 전달 될까요? 또한 불필요한 줄 바꿈을 모두 제거하기 위해 코드를 정리하면 도움이됩니다. – horchler

+0

작성된대로 아닙니다. 나는 lsqcurvefit을 각 tvec (i-1)에서 tvec (i)까지만 맞추면 각 시간 세그먼트에 가장 적합한 알파를 얻을 수 있다고 생각했다. 대신, 전 시간 범위에 걸쳐 가장 적합한 알파를 얻고 싶습니다. 나는이 주석이 당신의 질문을 적절하게 다루지 않는다고 생각하니? – Tim

+0

아무 것도 유용하게 사용하려면 적어도'lsqcurvefit'의 요구 사항에 해당하는'data' 함수가 필요하다고 생각합니다. 그것이 그 질문에 관한 것입니까? 그러면'init'과'time'은'X0'과'XDATA'에 해당합니다. 'data'의 결과는'XDATA' /'time'과 같은 길이가되어야합니다. – horchler

답변

0

아직 답변이 없지만 몇 가지 제안이있을 수 있습니다.

첫째, 통합 함수에 매개 변수를 전달하는 현대 (빠른) 방법은 익명 함수입니다 :

[t,y] = ode23s(@(t,y)Model(t,y,alpha,u(i-1)),[tvec(i-1) tvec(i)],y0); 

둘째, 당신은 두 번 일부 값을 추가하고 있습니다.

tout = [tout;t(2:end)]; 
yout = [yout;y(2:end,:)]; 

: 루프에서이 같은 새로운 데이터를 추가,

tout = tvec(1); 
yout = y0; 

그리고 그들이 일정한있어 이후 tvecfor 루프의 u 외부 이동하고 초기 시간과 상태에 toutyout를 초기화 마지막으로 고정 된 스텝 크기 출력을 지정하여 질문을 해결할 수 있는지 궁금합니다. tspan을 두 개 이상의 요소로 구성된 벡터로 설정하면됩니다. 그러면 적분기는 특정 시간에 포인트를 반환합니다.

관련 문제