Skip to main content

自動化參數掃描 (Parameter Sweeping 迴圈)

自動化參數掃描 (Parameter Sweeping 迴圈)

當你需要測試同一組模型,但想觀察某個參數(例如 Kp)在不同數值下的變化時,使用 for 迴圈是最高效的作法。

% 1. 準備工作
Kp_values = [0.5, 1.0, 1.5, 2.0, 2.5];  % 設定你想測試的 5 組 Kp 數值
num_tests = length(Kp_values);          % 計算總共要跑幾次 (這裡會是 5)

% 2. 開啟畫布並鎖定
figure;
hold on;  % 鎖定畫布,讓接下來迴圈裡的每一條線都畫在同一張圖上

% 3. 準備一個空的陣列來裝圖例名稱 (進階美化技巧)
legend_labels = cell(1, num_tests); 

% 4. 開始自動化迴圈
for i = 1:num_tests
    
    % (A) 更新參數
    Kp = Kp_values(i);  % 把現在要測的數值丟給 Kp
    
    % (B) 執行模擬 (限制步長確保畫圖平滑)
    out = sim('my_model', 'MaxStep', '0.01'); 
    
    % (C) 抓取資料
    t = out.tout;
    y = out.sim_result;
    
    % (D) 畫上這一回合的線
    plot(t, y, 'LineWidth', 1.5);
    
    % (E) 記錄這條線的名字,等一下給圖例 (Legend) 使用
    legend_labels{i} = ['Kp = ', num2str(Kp)]; 
    
end

% 5. 迴圈結束後,進行圖表美化
hold off; % 解除鎖定
title('不同 Kp 參數之系統響應掃描');
xlabel('時間 (s)');
ylabel('系統輸出');
legend(legend_labels); % 自動貼上我們剛剛在迴圈裡準備好的標籤名稱!
grid on;

% 6. 自動存檔 (可選)
exportgraphics(gcf, 'Kp_Sweep_Result.png', 'Resolution', 300);

💡 程式碼亮點解析: hold on 放外面:這非常重要!如果你把 hold on 寫在迴圈裡面,有時候 MATLAB 會傻掉。放在迴圈外面,就像是先在桌上釘好一張圖畫紙,然後迴圈裡的每次 plot 就是拿不同顏色的筆在上面畫畫。

num2str(Kp):這是一個超實用的函數。因為 Kp 是數字,但圖例 (legend) 只能吃「文字字串」。所以我們用 num2str 把數字變成文字,這樣圖標就會自動顯示 Kp = 0.5, Kp = 1.0 等等,非常聰明!

將模擬數據匯出至 Excel (Export to Excel)

% 1. 確保你已經從 out 物件中抓出數據
t = out.tout;               % 時間資料 (假設是 1000x1 的直行陣列)
y = out.sim_result;         % 模擬數據 (假設是 1000x1 的直行陣列)

% 2. 將時間與數據合併成一個大的矩陣 (用中括號 [ ] 並排)
% 注意:t 和 y 必須都是「直行 (Column vector)」,長度要一樣!
data_matrix = [t, y];

% 3. 將矩陣轉換成 Table 格式,並設定 Excel 的欄位名稱 (標題)
% 假設第一欄叫 'Time_sec',第二欄叫 'Motor_Speed_RPM'
T = array2table(data_matrix, 'VariableNames', {'Time_sec', 'Motor_Speed_RPM'});

% 4. 寫入 Excel 檔案
% 第一個參數是剛建立的表格 T,第二個參數是你想要的檔名
writetable(T, 'My_Simulation_Data.xlsx');

disp('✅ 資料已成功存入 Excel!');

💡 進階技巧:把迴圈掃描的結果存到「不同的工作表 (Sheet)」裡

如果你結合了前面的 for 迴圈(參數掃描),你可以利用 Sheet 屬性,把不同參數的結果存在同一個 Excel 檔案的不同分頁裡!

% 假設這段寫在迴圈裡,i 是迴圈的計數器,Kp 是當前的參數
sheet_name = ['Kp_', num2str(Kp)];  % 自動生成分頁名稱,例如 'Kp_1.5'

% 將數據寫入指定的 Sheet
writetable(T, 'Kp_Sweep_Data.xlsx', 'Sheet', sheet_name);