전기전자공학/제어

2. 매트랩 시뮬링크 구현

흔한 학생 2025. 5. 16. 14:53

MATLAB 신경망 학습 및 시뮬링크 연동 방법

회귀용 신경망인 `fitnet()` 을 이용해 모델을 생성할 것이다. 

  • 첫 번째 파라미터로 hidden layer의 노드 수가 들어간다.
  • 두 번째 파라미터로 알고리즘 명이 들어간다. 

그리고 `train(model, input, output)` 으로 학습을 하고 결과를 저장한다.
두 가지가 반환되며 해당 네트워크를 저장한다.

저장된 네트워크는 `gensim()` 함수로 시뮬링크 블록으로 변환할 수 있다. 

  • 파라미터로는 생성한 신경망 변수와 샘플링 주기가 들어간다.
  • `gensim()` 함수가 실행되지 않을 수 있는데 구버전용이기 때문이다?
  • 그래서 Deep Learning Toolbox Converter for Simulink 의 `genFunction()` 혹은 `genSimulink()` 로 대체할 수 있다.
% 1. 센서 및 시뮬레이션 데이터 로드
load sim_8mps2
load Rotorspeed1.mat
load foreaft_acc1.mat
load TBM.mat
load WINDRFT.mat

% 2. 신경망 구조 설정
n_nerons = [20 20 20];

%3. 입출력 데이터 구성
x_NN = [RotorSpeed1(2,200/Ts:end)'; foreaft_acc1(2,200/Ts:end)'; TBM(2,200/Ts:end)'];
t_NN = WINDRFT(2,200/Ts:end)';

% 4. 신경망 생성 및 학습
net_NN = fitnet(n_nerons,'trainbr');   % Bayesian Regularization backpropagation
[net_NN2,tr_NN] = train(net_NN,x_NN,t_NN);

% 5. 시뮬링크 블록 생성
gensim(net_NN2,Ts)

 

5/14

1. 신경망 없이 데이터 가져오기

8m/s wind를 터빈 모델에 넣고 FAA, rotorspeed, TBM 값을 파일로 뽑아냈다.
다만 값을 그대로 사용하려니 sample time도 이상하고 파일의 변수도 전부 이상했다.
알고보니 시뮬링크의 To File 블럭에서 설정이 가능했다. 변수 이름도 알기쉽게 바꾸고 포맷은 array로, 샘플링 시간은 1000 (아마 1000Hz?) 으로 했다. 
어쩐지 매트랩 워크스페이스에 파일을 load 해도 변수가 ans로 뜨더라

에러?
Warning: Network has been pruned of zero-sized or unused elements. 
> In network/gensim (line 131)
In NN (line 22)  
GENSIM: Input 1 has been pruned.
GENSIM: Layer 1 has been pruned.
GENSIM: Layer 2 has been pruned.
GENSIM: Layer 3 has been pruned.
GENSIM: Layer 4 has been pruned.
GENSIM: Output 1 has been pruned.
GENSIM: Generated Simulink neural network has no outputs.

gensim을 돌리니 이런 에러아닌 에러가 발생했다?
이는 신경망에서 시뮬링크에서 필요없다고 판단하여 자동으로 제거(prune)한 것이다. 
문제는 입력과 층, 출력 전부 제거당했다.

이 에러가 발생하는 이유는 실제로 입력을 쓰지 않아서 없애는 것일수도 있지만 입력이 모두 0일때도 삭제하는 경우가 있다고 한다.
나의 경우 입출력의 데이터 길이가 달라서 이렇게 제거가 된 것이었다.

size() 명령어로 확인했더니 출력의 길이가 입력의 절반이었다. 때문에 길이를 조절해주고 돌렸다. 
training results 아래에서 몇분간 epoch를 돌리고 완료 후 아래처럼 떴다. 

 

그리고 gensim() 명령어로 블럭을 생성해줬다.

이전에 오류가 났을 때는 gensim을 돌려도 해당 블럭 내부가 비어있었는데 이제는 사진상 화살표를 누르니 레이어 구성을 확인할 수 있었다.

시뮬링크 다시 run 했을 때 다시 오류발생 
Error:An error occurred during simulation and the simulation was terminated
Caused by:
    Simulink will stop the simulation of model 'scen1_try1' because the 2 zero crossing signal(s) identified below caused 1000 consecutive zero crossing events in time interval between 3.1554436208840472e-30 and 3.1585990645049313e-27.
 --------------------------------------------------------------------------------
Number of consecutive zero-crossings : 1000
       Zero-crossing signal name : MinmaxInput
                      Block type : MinMax
                      Block path : 'scen1_try1/Turbine, controller, PAC 1/Full envelop controller/Full Envelope Controller1/Pos.Only/MinMax'
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Number of consecutive zero-crossings : 1000
       Zero-crossing signal name : SwitchCond
                      Block type : Switch
                      Block path : 'scen1_try1/Turbine, controller, PAC 1/Full envelop controller/Full Envelope Controller1/Pos.OnlyS2/Switch1'
--------------------------------------------------------------------------------
 
    Suggested Actions:
         You can suppress the diagnostics and continue simulation without bracketing these zero crossings by switching the <a href="matlab:configset.internal.open('scen1_try1','ZeroCrossAlgorithm');"> zero crossing detection algorithm</a> to 'Adaptive' and setting the <a href="matlab:configset.internal.open('scen1_try1','IgnoredZcDiagnostic');">Ignored Zero Crossings</a> diagnostic to 'none'.
         Disable zero-crossing detection on the blocks listed above that caused the most events.

이렇게 하는게 맞는지 모르겠는데 
시뮬링크 - MODELING- Model Settings - zero crossing algorithm 검색 - zero crossing options - algorithm:adaptive
로 바꿈


절차

기본 배경 지식

turbine 모델을 이용해 풍속 데이터로 rotor speed, generator speed, generator torque 등 데이터를 얻을 수 있음.

여러 풍속 데이터를 가지고 있으며 turbine1에서의 풍속 데이터를 w_{t1}, turbine2에서 데이터를 w_{t2} 라고 가정

turbine1 에는 라이다가 있으며 라이다로 풍속을 측정할 수 있음. turbine 1의 데이터로 신경망을 구성하고 라이다가 없는 turbine2, turbine3 $\cdots$ 에 적용하여 풍속을 예측하였을 때 결과를 확인할 것임. 

이 가정대로라면 turbine1을 제외한 곳에는 라이다가 없기에 실제 풍속 데이터가 없어 예측값과 비교할 수 없음.
연구 결과를 확인하기위해 다른 터빈의 실제 풍속 데이터도 보유하고 있음. 

절차 

1. turbine1을 이용해 신경망을 구성

매우 초보이기 때문에 실수가 많았음

신경망을 훈련시키고 훈련된 신경망으로 예측해도 전혀 예측하지 못했다. 

다른 풍속데이터를 넣어서 나쁜 결과가 나오면 몰라도 훈련을 위한 데이터인 $w_{t1}$ 를 그대로 넣으면 좋은 결과가 나와야하는데 그러지 않았다.

이유는 샘플링 시간에 있었다. 샘플링 시간을 제대로 설정하지 않은 것... 

 

결과

v8_T1으로 학습하고 v8_T2, v8_T3, v8_T4, v8_T5 로 테스트 한 결과 

200초까지는 무시. 

 

 

neural network의 노드 수를 바꿔가며 실험 20 20 20 혹은 20 노드 

궁금한 것

  • 논문에서는 DLP라고 했는데 사실 4 layer 였던 건가?
  • 최적의 노드 수는 실험적으로 결정? 

v8 테스트 결과 MSE

노드 수(개) | 테스트 터빈 T5 T4 T3 T2
20 0.000490      
10 0.000327      
5 0.000391      
4 0.000327   0.000145 0.000296
3 0.000177 0.000160 0.000135 0.000183
2 0.000148 0.000141 0.000130 0.000185
1 0.000205 0.000246    
  • 풍속 8m/s 기준 노드가 2개일 때 좋은 성능을 보임 
  • 다른 풍속에서도 같은 결과일지는 모르겠음 

v10

큰 오차 발생

노드 수(개) | 테스트 터빈 T5 T4 T3 T2
20        
10        
5       0.366781
4        
3     0.034486 0.343054
2 0.018924 0.004625 0.039197 0.225106
1        

v12

결과 매우 안좋음

v16 해보기

v8만 되는건가?

 


세부 실험 과정

  1. 데이터 및 turbine 모델 준비
    • v12 풍속에 대한 신경망을 만들기 위해서는 v12_T1 데이터를 준비.
    • 풍속 데이터의 샘플링 단위는 0.02이며 얼마 시간동안의 데이터인지는 확인 필요 
  2. 풍속 데이터와 turbine 모델로 여러 변수에 대한 데이터 만들기.
    • rotor speed 등 다양한 변수에 대한 데이터를 얻을 수 있음.
    • 이때 풍속과 다른 변수는 0.01로 샘플링하여 mat 파일로 변환하기 (시뮬링크 상에서 진행)
  3. 신경망 학습하기
    • 만든 변수로 입출력 구성하여 신경망 학습하기(매트랩에서 진행)
    • 만든 파일 `load` 하고 `fitnet`, `train` 으로 학습
    • `gensim`으로 시뮬링크에서 사용가능한 신경망 블럭 만들기