2013-05-28 2 views
-1

ODE 솔버가 훌륭하고 부드럽게 작동하지만 모든 것을 한자리에 플롯해야합니다. 그림 (1) + (3)과 그림 (2) + (4)를 연결하면 시작 및 정지 조건을 설정해야하지만, 그것은 나를 위해 작동하지 않습니다. 나는 결과없이 x_m에 의해 끝 조건을 설정하려고 시도하고있다. 나는 내가 당신의 문제를 복제하지 못할 같은 대답을 잘 모르겠어요 (코드 나던 실행 ...) 그리고 어떤 이유로 난 아직 말씀 드릴 수 없습니다 :ODE 함수의 연속 플롯

options = odeset('Events',@events); 

[t,y] = ode45(@ph1,[0,w_max],[0,0], options); 
figure(1),plot(t,y(:,1)); 

x_n = y(:,1); 
v_n = y(:,2); 
x_m = x_n(end); 
v_m = v_n(end); 
q = max (t); 


d_v1 =diff(y(:,2));  
%d_t1 = diff(t); 
%a_c1 = d_v1./d_t1; 
t_c1 = t(1:end-1); 
%t_h1 = d_t1./2; 

figure (2) 
plot((t_c1),d_v1,'r') 
set(gca,'FontName','Times New Roman CE') 
title('Rychlost') 
xlabel('\it t\rm [s]') 
ylabel('\it v_n\rm [m*s^{-1}]') 
hold on 

[t,y] = ode45(@ph2,[0,w_max],[0,0], options); 
figure(3),plot(t,(y(:,1))); 

d_v =diff(y(:,2));  
%d_t = diff(t); 
%a_c = d_v./d_t; 
t_c = t(1:end-1); 
%t_h = d_t./2; 

figure(4),plot((t_c),(d_v), 'g'); 

% d_v2 =diff(d_v);  
% d_t2 = diff(d_t); 
% a_c2 = d_v2./(d_t2.*d_t2); 
% t_c2 = t(1:end-2); 

% figure(5),plot((t_c2),a_c2 , 'r'); 

function [value,isterminal,direction] = events(t,y) 

global ch 

value = y(1) - ch; 
isterminal = 1;   
direction = 0;   




function dx = ph1(tt,x) 
global F1 c m_c Ff p w s ln f_t sig dstr Ren pn Fex Fzmax xz xn l Fz m_n 

Fpp = F1 + c*x(1); 

if pn<0 
    pn=abs(pn); 
end 

if x(1)<ln 

    pn=spline(w,p,tt)-((2*sig)/dstr*Ren);  
    Fex=3.1416.*f_t.*pn.*(ln-x(1)); 
end 

if x(1)<42e-5 
    Fz = Fzmax*(1-(1/xz)*(x(1)+l)); 
end 

if x(1)>44e-3 
    m_c=m_c-m_n; 
end 


dx=[x(2);((spline(w,p,tt)*s)-Fpp-Ff-Fex-Fz)./m_c]; 

function dx=ph2(tt,x) 

global Fv Ft m_z g f Fzp alfa m_nbp c 

     Ft=m_z*g*f; 
     Fv = 2*f*(Fzp/cos(alfa)); 

     if x(1)>0.44 

     m_z=m_z+m_nbp 

     end 

     dx = [x(2);((x(1)*c)-Ft-Fv)/m_z]; 
+0

연결하여 어떤 의미입니까? – HebeleHododo

+0

@HebeleHododo 코멘트와 비슷하게 모든 것을 단일 플롯에서 그리거나 4 개의 서브 플롯을 원하십니까? –

+0

연속 기능. ph1이 끝나면 한 플롯에서 ph2가 시작됩니다. – user2401142

답변

0

좋아 날이 첫 번째를 가정 해 봅시다. 하지만 내가 너를 도울 수 있다고 생각해.

I. 두 개의 ODE를 별도로 해결하는 것처럼 보이지만 두 시간 모두 같은 시간 vecotr [0 w_max]로 해결됩니다. 둘 다 ODE를 하나의 함수 dx = diffeq (args)에 넣고 단순히 dx를 행 벡터로 만들 수 있습니다. 발생할 수있는 문제는 모든 ODE 해석기가 다른 수학 함수에 대해 서로 다른 시간 단계를 사용한다는 것입니다. 이제 'MaxStep'및 'MinStep'을 사용하여 타임 스텝을 조정하려는 유혹을받을 수 있지만 그렇게하지 마십시오. 당신은 느슨한 속도와 정확성 및 단순 통합 업체에 비해 MATLAB의 ODE 해결사의 모든 장점. 논리적으로 전혀 연결되지 않은 경우에도 미분 방정식을 동일한 함수에 넣어야합니다. 데이터를 쉽게 처리 할 수 ​​있습니다.

II. 같은 함수에서 두 미분 방정식을 풀면 같은 ode45/ode23 실행 시간에 똑같은 시간 벡터를 갖게됩니다. 또한, 솔루션 벡터는 동일한 크기를 갖습니다. 그 (것)들을 비교하는 것은 쉬운 일이어야한다. 그러나 나는 당신이 어떻게 피규어를 "연결"할 수 없는지 이해하지 못합니다. 왜냐하면 당신이하는 'plot (y)'대신에 'plot (x, y)'으로 항상 플로팅한다면 완벽하게 정렬되어야하기 때문입니다. 예 :

figure 

plot(t1,y1) 

hold on 

plot(t2, y2) 

't1'과 't2'를 사용했음을 알게 될 것입니다. 현재 코드에서는 첫 번째 't'를 두 번째 't'로 겹쳐 쓰며 디버깅에는 적합하지 않습니다.

III. 그냥 다른 조언 : 당신은 대신

x_n = y(:,1); 

v_n = y(:,2); 

같은 물건을하고있다, 당신은 인덱스에 대한 구조체를 만들 수 있고 거기에 변수 이름을 저장합니다. 그런 다음 숫자로 변수에 액세스하지 않고 해당 색인 만 사용합니다. 예를 들면 :

ind.x_n = 1; 

ind.v_n = 2; 

나중에 미분 방정식의 : DY (ind.x_n) = ... DY (ind.v_n) = ... 당신이 더 일단 그것은 당신에게 많은 도움이 될 것입니다 코드 및 기타 주.

IV. 이것은 마지막 지점으로 나를 데려다 준다. 더 많은 주! 전역 변수로 수행하는 작업은 매우 위험합니다! 디버깅이 거의 불가능하며 코드가 느려집니다. 내 diffeq에서 한 번 전역 변수를 사용하고 약 30 %의 속도가 느려졌습니다.

  • 은 당신이 한 번 단계를 "생존"해야 할 변수가있는 경우, 당신은 그것의 상태를 확인해야합니다, 당신은 다음 단계에서 기존의 'F1'를 사용하고 싶은 말은 할 수 있습니다. 이것은 물론 당신이 실제로 그것을 파생시킬 수 있음을 의미합니다. 네가 뭘 시뮬레이션하는지 모르겠어. 그래서 내가 말할 수 없어. 그냥 시도 해 봐!

  • 하나의 시간 단계에서만 계산하고 특정 시간 단계에서만 변수를 필요로하는 변수가있는 경우 변수를 전역으로 만들 필요가 없습니다. 그것은 단지 해를 끼친다!

나는 그것이 너무 많지 않았고 그것이 당신을 도왔 으면 좋겠다. 그렇지 않은 경우 git 저장소에 대한 링크를 실행 코드와 함께 제공하십시오. 그냥 추측 게임이다 이런 식으로 ...

+0

참고로 포스터가 무엇을하고 있는지 (또는 시도하려고했는지)에 대해 처음 생각하는 것 같지 않습니다. [이 질문] (http://stackoverflow.com/questions/16768447/matlab-ode-start-stop-conditions)을 참조하십시오. 두 번째 ODE는 동시에 시뮬레이트 될 수 없습니다. 두 번째 ODE는 첫 번째 조건의 첫 번째 조건이 이벤트를 통한 첫 번째 조건의 종결 상태에 의존하기 때문에 동시에 시뮬레이션 할 수 없습니다. 물론 여기에있는 코드는 그 사실을 전혀 보여주지 않거나 명확하게합니다. – horchler

+0

그리고 전역 변수에 대한 논의가 있습니다. 여기에 사용할 이유가 없습니다. – horchler

+0

@horchler 내가 배운 것처럼, 전역 변수를 사용할 이유가 있어야하며 그 반대도 마찬가지이다. 기능 입출력은 항상 작동해야합니다. 특히 시스템이 고조파 발진기 인이 경우에는 실제로 더 나은 옵션이 있습니다. – Cat

0

나는 이것을 사용 :

(t, y는) 두 번째에서 첫 ODE와 (TT, 전년 동기 대비)에서이다
yy=y(:,1); 
tt=t; 
figure(3),plot(t+tt(end),abs((y(end:-1:1,1))),tt,yy); 

. 어쩌면 누군가를 도울 수 있습니다