# Index exceeds the number of array elements. Index must not exceed 1.

6 views (last 30 days)

Show older comments

function cost = optimize_PID(k)

assignin('base', 'k', k);

sim('DABvoltagecontrol.slx');

ITAE = load('ITAE.mat');

num_samples = size(ITAE.ans , 1);

ITAE_value = ITAE.ans(1, num_samples);

cost = ITAE_value(num_samples);

end

while executing the code, error is showing : Index exceeds the number of array elements. Index must not exceed 1. the ITAE is loaded to .mat format

##### 0 Comments

### Answers (2)

Torsten
on 7 Feb 2024

Edited: Torsten
on 7 Feb 2024

num_samples = size(ITAE.ans , 1);

ITAE_value = ITAE.ans(1, num_samples);

num_samples is the number of rows of ITAE.ans, but you use it in setting ITAE_value as if it were the number of columns.

Maybe you mean

ITAE_value = ITAE.ans(num_samples,1);

?

##### 2 Comments

Torsten
on 7 Feb 2024

Sam Chak
on 7 Feb 2024

Hi @Deepti t

I would recommend calculating the ITAE (Integral of Time-weighted Absolute Error) within the Simulink model and connecting the output to the 'Outport' block. This approach is more straightforward. However, it appears that you are searching for a single parameter, k in the 3-gain PID controller, to minimize the ITAE. Here is a code snippet that may help you with that:

function cost = optimize_PID(k)

assignin('base', 'k', k);

[t, x, y] = sim('DABvoltagecontrol.slx');

cost = y(end, 1); % number 1 Outport block

end

##### 10 Comments

Sam Chak
on 8 Feb 2024

But your error says that out.ITAE is a time series data. Despite setting the To Workspace block to send data as 'Array', it seems that the logged data is still in the 'Time series' format. Am I missing something?

out.ITAE

timeseries

Common Properties:

Name: ''

Time: [328012x1 double]

TimeInfo: [1x1 tsdata.timemetadata]

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!