Multiple if statement are not updating my equation over time.

1 view (last 30 days)
I am trying to update the variable Feed ,which is the number of logs I am adding to a fire, at different time intervals. The first if statement changes the function but the following elseif statement do nothing to the function when it is graphed.
clear all; clc;
% Inputs
Lam = 0.000127921; % assuming a log is putting out negligible heat transfer at 200 W/m^2 %0.000089
k1= 0.2; % W/m^2*k
k2 = 10; % variable from 1-10 W/m^2*k [lower will increase temps between floors]
k3 = 0.5; % W/m^2*k
Qin = @(t) 500*exp(-Lam*t); % 500 is one log variable with max 2500 W/m^2
Ain = 0.5; % m^3
Cv = 1005; % J/kg*k
p = 1.2; % Kg/m^3 density air
Tout = @(t) -10*sin((2*pi*t)/86400) + 273;
A1 = 2*(6*3)+(2*(5*3)); % Areas for Q1
A2 = 5*6; % Area for Q2
A3 = 6*3 + sqrt(18)*5*2; % Area for Q3
V1 = 6*5*3; % volume downstairs
V2 = .5*3*6*5; % volume upstairs
h = 1; % step size
Lt = 172800; % 48 hours to seconds
N = Lt/h;
Feed = 1; % preallocate
% Initial Values
T1(1) = 278;
T2(1) = 280;
t(1) = 0;
% functions
if t == 0
Feed = 4;
k2 = 8;
elseif t == 60000
Feed = 100;
k2 = 10;
elseif t == 2*3600
Feed = 100;
k2 = 10;
elseif t == 3*3600
Feed = 100;
k2 = 10;
elseif t == 4*3600
Feed = 100;
k2 = 10;
elseif t == 5*3600
Feed = 100;
k2 = 10;
elseif t == 6*3600
Feed = 100;
k2 = 10;
elseif t == 180000
Feed = 1;
k2 =1;
end
dT1 = @(t,T1,T2) ((Ain*Qin(t)*Feed+((-A1*(k1*(T1-Tout(t))))-(A2*(T1-T2+5)))))/(Cv*p*V1);
dT2 = @(t,T1,T2) ((A2*k2*(T1-T2+5))-(A3*k3*(T2-Tout(t))))/(Cv*p*V2);
perfect(1) = 293;
t_last_log = 0;
for i = 1:N
% independent var update
t(i+1) = t(i) + h;
perfect(i+1) = perfect(i);
plusfive(1) = 298;
minusfive(1) = 288;
plusfive(i+1) = plusfive(i);
minusfive(i+1) = minusfive(i);
% dependent var update
T1(i+1) = T1(i) + h*dT1(t(i),T1(i),T2(i));
T2(i+1) = T2(i) + h*dT2(t(i),T1(i),T2(i));
Terror(i) = max((abs(T1(i)-293)+abs(T2(i)-293))/(2*N));
end
MaxError = max(Terror(i))
MaxError = 8.6099e-05
figure(1); clf(1);
plot(Tout(t),'r-')
xlabel('Time');
ylabel('Temperature (K)')
hold on
% figure(2); clf(2);
plot(t,T1,'b-')
plot(t,T2,'g-')
plot(t,perfect,'k--','linewidth',0.1);
plot(t,plusfive,'r--','linewidth',0.1);
plot(t,minusfive,'r-.','linewidth',0.1);
xlabel('Time (seconds)')
ylabel('Temperature (K)')
legend('Outside Temp','Ground Floor','Top Floor','20 C','25 C','15 C')
  5 Comments
Lukas Walden-Richards
Lukas Walden-Richards on 8 Mar 2023
I am not apposed to other options that are not anonymous functions. I am just getting started in matlab. For the example function that you wrote for k2, I am getting the same result where there is only one value for k2 when I run the script.
Rik
Rik on 8 Mar 2023
How did you check that? And how did you implement the function I suggested?

Sign in to comment.

Answers (1)

Shushant
Shushant on 13 Mar 2023
According to my understanding you are looking for the conditional statements to work as a function which should change the values of "Feed" and "k2" based on the value of "t" preferably after each iteration of the loop. To accomplish this, there are two ways:
  1. Place conditional statements inside the loop and modifying t to t(i).
  2. Create a function which takes "t" as an input and outputs "Feed" and "k2". There is also a need to put an "else" statement so that if for a certain value of "t" none of the condition gets satisfied a value of "Feed" and "k2" is defined to be passed back. After defining the function, we call it from the inside of "for" loop to update the value of "Feeds" and "k2" in every iteration based on the current value of "t". Please find the below code for the same.
clear all; clc;
% Inputs
Lam = 0.000127921; % assuming a log is putting out negligible heat transfer at 200 W/m^2 %0.000089
k1= 0.2; % W/m^2*k
k2 = 10; % variable from 1-10 W/m^2*k [lower will increase temps between floors]
k3 = 0.5; % W/m^2*k
Qin = @(t) 500*exp(-Lam*t); % 500 is one log variable with max 2500 W/m^2
Ain = 0.5; % m^3
Cv = 1005; % J/kg*k
p = 1.2; % Kg/m^3 density air
Tout = @(t) -10*sin((2*pi*t)/86400) + 273;
A1 = 2*(6*3)+(2*(5*3)); % Areas for Q1
A2 = 5*6; % Area for Q2
A3 = 6*3 + sqrt(18)*5*2; % Area for Q3
V1 = 6*5*3; % volume downstairs
V2 = .5*3*6*5; % volume upstairs
h = 1; % step size
Lt = 172800; % 48 hours to seconds
N = Lt/h;
Feed = 1; % preallocate
% Initial Values
T1(1) = 278;
T2(1) = 280;
t(1) = 0;
dT1 = @(t,T1,T2) ((Ain*Qin(t)*Feed+((-A1*(k1*(T1-Tout(t))))-(A2*(T1-T2+5)))))/(Cv*p*V1);
dT2 = @(t,T1,T2) ((A2*k2*(T1-T2+5))-(A3*k3*(T2-Tout(t))))/(Cv*p*V2);
perfect(1) = 293;
t_last_log = 0;
for i = 1:N
[Feed,k2]=CalculateMyLogs(t(i)); % passing t(i) to the function to get the value of Feed.
dT1 = @(t,T1,T2) ((Ain*Qin(t)*Feed+((-A1*(k1*(T1-Tout(t))))-(A2*(T1-T2+5)))))/(Cv*p*V1);
dT2 = @(t,T1,T2) ((A2*k2*(T1-T2+5))-(A3*k3*(T2-Tout(t))))/(Cv*p*V2);
perfect(1) = 293;
t_last_log = Feed;
% independent var update
t(i+1) = t(i) + h;
perfect(i+1) = perfect(i);
plusfive(1) = 298;
minusfive(1) = 288;
plusfive(i+1) = plusfive(i);
minusfive(i+1) = minusfive(i);
% dependent var update
T1(i+1) = T1(i) + h*dT1(t(i),T1(i),T2(i));
T2(i+1) = T2(i) + h*dT2(t(i),T1(i),T2(i));
Terror(i) = max((abs(T1(i)-293)+abs(T2(i)-293))/(2*N));
end
MaxError = max(Terror(i))
MaxError = 1.0463e-04
MaxError = 8.6099e-05
MaxError = 8.6099e-05
figure(1); clf(1);
plot(Tout(t),'r-')
xlabel('Time');
ylabel('Temperature (K)')
hold on
% figure(2); clf(2);
plot(t,T1,'b-')
plot(t,T2,'g-')
plot(t,perfect,'k--','linewidth',0.1);
plot(t,plusfive,'r--','linewidth',0.1);
plot(t,minusfive,'r-.','linewidth',0.1);
xlabel('Time (seconds)')
ylabel('Temperature (K)')
legend('Outside Temp','Ground Floor','Top Floor','20 C','25 C','15 C')
% function
function [Feed, k2] = CalculateMyLogs(t)
if t == 0
Feed = 4;
k2 = 8;
elseif t == 60000
Feed = 100;
k2 = 10;
elseif t == 2*3600
Feed = 100;
k2 = 10;
elseif t == 3*3600
Feed = 100;
k2 = 10;
elseif t == 4*3600
Feed = 100;
k2 = 10;
elseif t == 5*3600
Feed = 100;
k2 = 10;
elseif t == 6*3600
Feed = 100;
k2 = 10;
elseif t == 180000
Feed = 1;
k2 =1;
else
Feed = 1;
k2 = 1;
end
end
I will recommend you to use breakpoints in the code to check and get a better understanding on the execution of the code. More information on breakpoints can be found here - Set Breakpoints - MATLAB & Simulink (mathworks.com)
For more information on conditional statements and relational operators, kindly go through the following documentation links.

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Products


Release

R2022a

Community Treasure Hunt

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

Start Hunting!