自動化參數掃描 (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);