Receiving Errors with this code

1 view (last 30 days)
Francis Mireles
Francis Mireles on 1 May 2024
Answered: Voss on 14 Oct 2024
% Define range of PID gains to explore
Kp_range = 0:0.1:5;
Ki_range = 0:0.1:1;
Kd_range = 0:0.1:0.5;
% Define setpoint temperature and other constants
setpoint = 25.0; % Setpoint temperature in degrees Celsius
temperature_range = 0:0.1:50; % Range of temperature values
% Initialize arrays to store performance metrics
overshoot = zeros(length(Kp_range), length(Ki_range), length(Kd_range));
settling_time = zeros(length(Kp_range), length(Ki_range), length(Kd_range));
% Simulate PID control system for each combination of gains
for i = 1:length(Kp_range)
for j = 1:length(Ki_range)
for k = 1:length(Kd_range)
% Calculate control output using PID algorithm
output = Kp_range(i) * (setpoint - temperature_range) + ...
Ki_range(j) * trapz(temperature_range, setpoint - temperature_range) + ...
Kd_range(k) * gradient(setpoint - temperature_range);
% Calculate overshoot and settling time
[overshoot(i,j,k), settling_time(i,j,k)] = calculate_performance(output, setpoint);
end
end
end
% Reshape overshoot and settling time arrays for plotting
overshoot_2d = squeeze(max(overshoot, [], 3));
settling_time_2d = squeeze(min(settling_time, [], 3));
% Plot overshoot and settling time as a function of Kp and Ki
figure;
subplot(2,1,1);
surf(Kp_range, Ki_range, overshoot_2d);
xlabel('Proportional Gain (Kp)');
ylabel('Integral Gain (Ki)');
zlabel('Overshoot (%)');
title('Overshoot vs. PID Gains');
subplot(2,1,2);
surf(Kp_range, Ki_range, settling_time_2d);
xlabel('Proportional Gain (Kp)');
ylabel('Integral Gain (Ki)');
zlabel('Settling Time (seconds)');
title('Settling Time vs. PID Gains');
% Function to calculate overshoot and settling time
function [os, ts] = calculate_performance(output, setpoint)
os = max(output) - setpoint;
ts = 0;
for t = 2:length(output)
if abs(output(t) - setpoint) < 0.02 * setpoint && ts == 0
ts = t - 1;
end
end
end
Error using '
TRANSPOSE does not support N-D arrays. Use PAGETRANSPOSE/PAGECTRANSPOSE to transpose pages or PERMUTE to reorder dimensions of N-D
arrays.
Error in controlsexample (line 32)
surf(Kp_range, Ki_range, overshoot');
>> controlsexample
Error using surf
Data dimensions must agree.
Error in controlsexample (line 32)
surf(Kp_range, Ki_range, squeeze(overshoot(:,:,1)));
>> controlsexample
Error using surf
Data dimensions must agree.
Error in controlsexample (line 32)
surf(Kp_range, Ki_range, squeeze(overshoot(:,:,1)));
>> controlsexample
Error using surf
Data dimensions must agree.
Error in controlsexample (line 32)
surf(Kp_range, Ki_range, squeeze(overshoot(:,:,1)));
>> controlsexample
Error using surf
Data dimensions must agree.
Error in controlsexample (line 36)
surf(Kp_range, Ki_range, overshoot_2d);
>> controlsexample
Error using surf
Data dimensions must agree.
Error in controlsexample (line 36)
surf(Kp_range, Ki_range, overshoot_2d);
>>

Answers (1)

Voss
Voss on 14 Oct 2024
% Define range of PID gains to explore
Kp_range = 0:0.1:5;
Ki_range = 0:0.1:1;
Kd_range = 0:0.1:0.5;
% Define setpoint temperature and other constants
setpoint = 25.0; % Setpoint temperature in degrees Celsius
temperature_range = 0:0.1:50; % Range of temperature values
% Initialize arrays to store performance metrics
overshoot = zeros(length(Kp_range), length(Ki_range), length(Kd_range));
settling_time = zeros(length(Kp_range), length(Ki_range), length(Kd_range));
% Simulate PID control system for each combination of gains
for i = 1:length(Kp_range)
for j = 1:length(Ki_range)
for k = 1:length(Kd_range)
% Calculate control output using PID algorithm
output = Kp_range(i) * (setpoint - temperature_range) + ...
Ki_range(j) * trapz(temperature_range, setpoint - temperature_range) + ...
Kd_range(k) * gradient(setpoint - temperature_range);
% Calculate overshoot and settling time
[overshoot(i,j,k), settling_time(i,j,k)] = calculate_performance(output, setpoint);
end
end
end
% Reshape overshoot and settling time arrays for plotting
overshoot_2d = squeeze(max(overshoot, [], 3));
settling_time_2d = squeeze(min(settling_time, [], 3));
% Plot overshoot and settling time as a function of Kp and Ki
figure;
subplot(2,1,1);
surf(Kp_range, Ki_range, overshoot_2d.');
xlabel('Proportional Gain (Kp)');
ylabel('Integral Gain (Ki)');
zlabel('Overshoot (%)');
title('Overshoot vs. PID Gains');
subplot(2,1,2);
surf(Kp_range, Ki_range, settling_time_2d.');
xlabel('Proportional Gain (Kp)');
ylabel('Integral Gain (Ki)');
zlabel('Settling Time (seconds)');
title('Settling Time vs. PID Gains');
% Function to calculate overshoot and settling time
function [os, ts] = calculate_performance(output, setpoint)
os = max(output) - setpoint;
ts = 0;
for t = 2:length(output)
if abs(output(t) - setpoint) < 0.02 * setpoint && ts == 0
ts = t - 1;
end
end
end

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!