Please help me correct this error: Error in P_function>P_panelpower (line 26) elseif t>=6 && t<11 Error in P_function (line 10) P = P_panelpower(t);

조회 수: 1 (최근 30일)
% Defining time start and end time from midnight to 24th hour with 6mins intervals
tstart=0;
tend=24;
% Defining total number of samples including the end points
samples=(tend-tstart)/0.1 + 1;
% Defining time vector
t=linspace(tstart,tend,samples);
% Calculating P(t) and storing it in P
P = P_panelpower(t);
Operands to the logical AND (&&) and OR (||) operators must be convertible to logical scalar values. Use the ANY or ALL functions to reduce operands to logical scalar values.

Error in solution>P_panelpower (line 23)
elseif t>=6 && t<11
% Plotting the panel power P(t)
plot(t, P);
xlabel('Time (hours)');
ylabel('Power output (kW)');
title('Power output of PV panel set');
%Total energy produced in an average day from the panel set
energy = sum(P) * 0.1; % Multipluing by 0.1 because each interval is 0.1 hour, basically from kWmin to kWh
% Displaying total energy
fprintf('Total energy produced in an average day: %.2f kWh\n', energy);
% Defining P(t) function using if else condition statments
function P = P_panelpower(t)
if t<6
P=0;
elseif t>=6 && t<11
P= 15*(1-cos(pi*((t-6)/5)));
elseif t>=11 && t<13
P= 30;
elseif t>=13 && t<18
P =15*(1+cos(pi*((t-13)/5)));
else
P=0;
end
end
  댓글 수: 1
Nicholas St. John
Nicholas St. John 2024년 2월 9일
Hi,
When you do comparison operators (< == > etc.) on an array, you get a logical array back indicating the response for each element, however, these if/else statements need a scalar value. My first guess would be to have a for loop and check for each element to do this.

댓글을 달려면 로그인하십시오.

답변 (2개)

Walter Roberson
Walter Roberson 2024년 2월 9일
You are passing a vector to your function.
Inside your function you are testing the entire vector at the same time. If the entire vector is less than 6, you return a scalar 0. If the entire vector >=6 && less than 11 then you apply a transformation to the entire vector. And so on.
Except, when you test an entire vector you are not permitted to use the && operator, which is reserved for testing scalar operations.
Maybe you want
elseif all(t>=6) && all(t<11)
... but probably not.
You have several choices:
  1. Ensure that you only ever call the function with a scalar
  2. Code with all() or any() to test the entire vector appropriately (not recommended)
  3. change the && to & (not recommended)
  4. Change the function entirely to use logical indexing

Nicholas St. John
Nicholas St. John 2024년 2월 9일
% Defining time start and end time from midnight to 24th hour with 6mins intervals
tstart=0;
tend=24;
% Defining total number of samples including the end points
samples=(tend-tstart)/0.1 + 1;
% Defining time vector
t=linspace(tstart,tend,samples);
% Calculating P(t) and storing it in P
P = P_panelpower(t);
% Plotting the panel power P(t)
plot(t, P);
xlabel('Time (hours)');
ylabel('Power output (kW)');
title('Power output of PV panel set');
%Total energy produced in an average day from the panel set
energy = sum(P) * 0.1; % Multipluing by 0.1 because each interval is 0.1 hour, basically from kWmin to kWh
% Displaying total energy
fprintf('Total energy produced in an average day: %.2f kWh\n', energy);
Total energy produced in an average day: 210.00 kWh
% Defining P(t) function using if else condition statments
function P = P_panelpower(t)
for i = 1:length(t)
if t(i)<6
P(i)=0;
elseif t(i)>=6 && t(i)<11
P(i)= 15*(1-cos(pi*((t(i)-6)/5)));
elseif t(i)>=11 && t(i)<13
P(i)= 30;
elseif t(i)>=13 && t(i)<18
P(i) =15*(1+cos(pi*((t(i)-13)/5)));
else
P(i)=0;
end
end
end

카테고리

Help CenterFile Exchange에서 MATLAB에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by