Error in flood_algorithm_rtc_pv (line 22) best_fitness = objective_​function(b​est_soluti​on, V_data, I_data); i don not understand this error

1 view (last 30 days)
flood_algorithm_rtc_pv()
Arrays have incompatible sizes for this operation.

Error in solution>@(V)Iph-I0*(exp((V+Rs*I_actual)/(n*Vt))-1)-(V+Rs*I_actual)/Rsh (line 57)
I_model = @(V) Iph - I0 * (exp((V + Rs * I_actual) / (n * Vt)) - 1) - (V + Rs * I_actual) / Rsh;

Error in solution>objective_function (line 58)
I_calc = I_model(V);%arrayfun(I_model, V);

Error in solution>flood_algorithm_rtc_pv (line 23)
best_fitness = objective_function(best_solution, V_data, I_data);
function flood_algorithm_rtc_pv
% RTC Silicon Solar Cell Data (example data, replace with datasheet values)
V_data = [0:0.1:0.6]; % Voltage (V), replace with actual data
I_data = [0.7605, 0.754, 0.746, 0.734, 0.717, 0.693, 0.661, ...
0.620, 0.570, 0.510, 0.450, 0.390, 0.330, 0.260, ...
0.180, 0.090, 0.010, 0]; % Example current points (adjust if real data available)
% Flood Algorithm Parameters
population_size = 50; % Number of water drops
max_iterations = 500; % Maximum iterations
evaporation_rate = 0.2; % Water loss per iteration
spread_factor = 0.05; % Spread factor (smaller for fine-tuning)
bounds = [0.02, 0.03; % Iph bounds (close to Isc from datasheet)
1e-9, 1e-6; % I0 bounds
0, 0.5; % Rs bounds
100, 1000; % Rsh bounds
1, 2]; % n bounds (ideality factor)
% Initialize water drops (population)
population = initialize_population(population_size, bounds);
best_solution = population(1, :);
best_fitness = objective_function(best_solution, V_data, I_data);
% Flood Algorithm Loop
for iter = 1:max_iterations
for i = 1:population_size
% Evaluate fitness of each drop
fitness = objective_function(population(i, :), V_data, I_data);
if fitness < best_fitness
best_fitness = fitness;
best_solution = population(i, :);
end
% Evaporation and Spread
population(i, :) = evaporate_and_spread(population(i, :), bounds, spread_factor, evaporation_rate);
end
% Display progress
if mod(iter, 50) == 0
fprintf('Iteration: %d, Best Fitness: %.6f\n', iter, best_fitness);
end
end
% Results
fprintf('Optimal Parameters:\n');
fprintf('Iph: %.6f, I0: %.6e, Rs: %.6f, Rsh: %.6f, n: %.6f\n', best_solution);
end
% Objective Function: Root Mean Square Error (RMSE)
function error = objective_function(params, V, I_actual)
Iph = params(1);
I0 = params(2);
Rs = params(3);
Rsh = params(4);
n = params(5);
Vt = 0.025; % Thermal voltage at 25°C (adjust if needed)
I_model = @(V) Iph - I0 * (exp((V + Rs * I_actual) / (n * Vt)) - 1) - (V + Rs * I_actual) / Rsh;
I_calc = I_model(V);%arrayfun(I_model, V);
error = sqrt(mean((I_actual - I_calc).^2));
end
% Initialize Population
function population = initialize_population(population_size, bounds)
num_params = size(bounds, 1);
population = zeros(population_size, num_params);
for i = 1:num_params
population(:, i) = bounds(i, 1) + (bounds(i, 2) - bounds(i, 1)) * rand(population_size, 1);
end
end
% Evaporate and Spread
function new_drop = evaporate_and_spread(drop, bounds, spread_factor, evaporation_rate)
num_params = length(drop);
new_drop = drop;
for i = 1:num_params
% Evaporation (reduce by evaporation rate)
new_drop(i) = new_drop(i) * (1 - evaporation_rate);
% Spread (random perturbation within bounds)
spread = spread_factor * (bounds(i, 2) - bounds(i, 1));
new_drop(i) = new_drop(i) + spread * (2 * rand - 1);
% Ensure bounds are respected
new_drop(i) = max(min(new_drop(i), bounds(i, 2)), bounds(i, 1));
end
end

Accepted Answer

Torsten
Torsten on 29 Jan 2025
Moved: Torsten on 29 Jan 2025
V_data and I_data must be of the same size. This is not the case in your code.

More Answers (0)

Categories

Find more on Symbolic Math Toolbox in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!