Multiple if statement are not updating my equation over time.

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

You did not define feed and k2 as function of t, but simply as normal scalar. I suspect that is one of the reasons why the result doesn't match your expectations. There might also be some issues because you expect t to have an exact value, which it might not get.
Thanks for the response. Why does it respond to the first if statement at t == 0? I have tried rearanging so that the first if statement is 3600 or any other number in the range but it does nothing to the function.
k=1;
if k==2,disp('foo'),end
if k==1,disp('bar'),end
if k==3,disp('foobar'),end
Do you expect this code to have a different result if you switch around the lines with the ifs? The same goes for your code.
Writing 'functions' in your comment doesn't make it a function. If you want k2 to have some specific value for a specific range of values of t, you will have to write that function.
One possibility (if you insist on an anonymous function) is this:
k2 = @(t) ...
8 * ( t>=0 & t<(2*3600) ) +...
12 * ( t>=(2*3600) & t<60000 ) +...
10 * ( t>=60000 & t<180000 ) +...
1 * ( t>=180000 );
Or you could try something like interp1.
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.
How did you check that? And how did you implement the function I suggested?

Sign in to comment.

Answers (1)

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

Answered:

on 13 Mar 2023

Community Treasure Hunt

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

Start Hunting!