自動化參數掃描 (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)
跑完 Simulink 後,如果想把時間軸(Time)和數據(Data)存成 .xlsx 檔,最專業的做法是先將資料轉成「表格 (Table)」,再加上欄位名稱,最後匯出。
% 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);