2013-08-14 2 views
1

나는 잘 돌아 다니고있는 Modelica 시뮬레이션 (Dymola 사용)에서 변수를 선택했습니다. 이제 인덱스를 사용하여 번호가 지정된 특정 변수의 동작을 계획하고 싶습니다. 나는 변수 대 시간을 플로팅하고 싶지는 않지만 그들의 인덱스와 비교한다. plotArray 기능을 사용할 계획이지만이 게시물에서 내가 궁금한 것이 아닙니다. 문제는 모든 변수가 실제로 호출 될 때 제로이고, 실제로 초기 값이지만, 안정 상태가 설정되면 값을 얻고 자 할 때, time = 5000이라고 가정 해 봅시다. 따라서이 특정 시간에 변수를 평가해야합니다.Modelica의 특정 시간에 변수를 평가합니다.

시뮬레이션에서 특정 시점의 변수를 평가하거나 시뮬레이션이 끝난 시점에서 변수를 평가하려면 어떻게합니까?

편집 : 광범위한 인터넷 검색 후 나는 내가 원하는 것을 할 것 같다 val()라는 기능을 통해 왔어요,하지만 난 내 Dymola 소프트웨어와 함께 동작하지 않습니다.

편집 2 : 필자는 필자의 변수를 원하는대로 평가할 수 있었지만, 필자가 사용했던 접근 방법은 지루할 정도였다. 시뮬레이션에서 .mat 파일을 MATLAB으로 추출한 후 MATLAB을 사용하여 결국 원하는 변수를 식별 한 다음 원하는 시간에 그 파일을 플로팅했습니다. 그러나 실제로 나를 놀라게 한 것은 .mat 파일의 변수와 관련하여 명백한 혼란이었습니다. 첫눈에, Modelica 모델에서 변수가 어떻게 배열되는지와 .mat 파일에서 변수가 어떻게 정렬되는지에 대해서는 거의 일치하지 않았고, 변수 이름을 지정하지 않았기 때문에 변수를 검색 할 때만 변수를 검색 할 수있었습니다 Dymola 시뮬레이션으로 값. 나는 단순히 여기에서 완전히 오인 되었습니까, 아니면 .mat 파일에서 변수를 추출하는 쉬운 방법이 있습니까?

답변

1

DymBrowse.m을 사용하여 결과 파일의 변수를 Matlab에로드 할 수 있습니다. \ Program Files \ Dymola xx \ Mfiles \ dymtools에서 사용할 수 있습니다. \ Mfiles ... 디렉토리를 MATLAB 경로에 추가하십시오.

2

어쩌면 나는 당신의 질문을 오해하고있다. 그러나 나는 여기에 간단한 대답이 있다고 생각한다. 배열이있는 것처럼 들리며 특정 시간에 특정 변수의 값으로 해당 배열을 채우고 배열을 플롯하려고합니다. 예를 들어, 변수가 x이고, x이 특정 임계 값을 넘은 시간을 기록한다고 가정 해 봅시다. 이런 간단한 모델은 충분 : 물론

model RecordVariables 
    Real x; 
    Real times[10]; 
initial equation 
    x = 11; 
equation 
    der(x) = -x; 
    when x<=10.0 then 
    times[1] = time; 
    end when; 
    when x<=9.0 then 
    times[2] = time; 
    end when; 
    when x<=8.0 then 
    times[3] = time; 
    end when; 
    when x<=7.0 then 
    times[4] = time; 
    end when; 
    when x<=6.0 then 
    times[5] = time; 
    end when; 
    when x<=5.0 then 
    times[6] = time; 
    end when; 
    when x<=4.0 then 
    times[7] = time; 
    end when; 
    when x<=3.0 then 
    times[8] = time; 
    end when; 
    when x<=2.0 then 
    times[9] = time; 
    end when; 
    when x<=1.0 then 
    times[10] = time; 
    end when; 
end RecordVariables; 

, 모든 when 조항을 작성하는 것은 매우 지루한입니다. 따라서 우리는 실제로 다음과 같이 더 컴팩트 한 버전을 만들 수 있습니다.

model RecordVariables2 
    Real x; 
    Real times[5]; 
    Integer i; 
    Real next_level; 
initial equation 
    next_level = 10.0; 
    x = 11; 
    i = 1; 
algorithm 
    der(x) :=-x; 
    when x<=pre(next_level) then 
    times[i] :=time; 
    if i<size(times,1) then 
     i :=pre(i) + 1; 
     next_level :=next_level - 1.0; 
    end if; 
    end when; 
end RecordVariables2; 

이 접근 방식에 대한 몇 가지 의견이 있습니다. 먼저 pre 연산자를 사용합니다. 이것은 inext_level 변수의 값을 when 절에 의해 생성 된 이벤트 전후에 구별하는 데 필요합니다. 둘째, 인덱스 itimes 버퍼를 "오버플로"할만큼 커지지 않도록 when 절에있는 if 문을 확인합니다. 이렇게하면 times을 원하는 크기로 설정하고 오버플로를 방지 할 수 있습니다. 그러나이 모델에서는 times을 너무 커서 어떤 값은 채워지지 않을 수도 있습니다.

이 정보가 도움이되기를 바랍니다.

관련 문제