If/Else Statements#
What If My Code Needs to Make Decisions?#
Back to our parachutist. In the real problem, the drag coefficient changes when the parachute opens:
Free-fall: c = 12.5 kg/s
Parachute open: c = 68 kg/s (much more air resistance!)
The parachute opens after 5 seconds. How do you handle this in code?
t = 7 # current time
if t < 5:
c = 12.5 # free-fall
else:
c = 68.0 # parachute deployed
print(f"At t={t}s, drag coefficient = {c} kg/s")
Without if/else, you’d need two completely separate programs: one for before the parachute opens, one for after. With if/else, your code adapts automatically.
Basic Syntax#
The structure is: if CONDITION: followed by indented code. Use elif (else if) for additional conditions, and else for the default case. Indentation matters!
temperature = 373.15
if temperature > 373.15:
print("Water is vapor")
elif temperature == 373.15:
print("Water is at boiling point")
else:
print("Water is liquid (or solid)")
Comparison Operators#
Operator |
Meaning |
|---|---|
|
Equal to |
|
Not equal to |
|
Less than |
|
Greater than |
|
Less than or equal |
|
Greater than or equal |
Combining Conditions#
Use and, or, not to combine multiple conditions.
and: both conditions must be trueor: at least one condition must be truenot: flips true to false (and vice versa)
T = 300
P = 101
if T > 273 and P > 100:
print("Above STP")
if T < 273 or P < 100:
print("Below normal conditions")
if not (T > 373):
print("Not boiling")
Numerical Methods: Convergence Checking#
Here’s the pattern you’ll use constantly in this course. Almost every iterative method (bisection, Newton-Raphson, Gauss-Seidel) needs to know when to stop. The answer? Check if the error is small enough:
tolerance = 1e-6 # Stop when error is below this threshold
if abs(error) < tolerance:
print("Converged! Solution found.")
else:
print("Not yet. Keep iterating...")
This tiny snippet is the heart of numerical methods. You’ll see it in nearly every algorithm we study. The tolerance (1e-6 means \(10^{-6}\), or 0.000001) controls how accurate your answer needs to be.
Real Example: Stopping a Root-Finding Loop#
In practice, you’ll use this inside a loop. Here’s the pattern:
tolerance = 1e-6
max_iterations = 100
for iteration in range(max_iterations):
# ... do some computation to get x_new ...
error = abs(x_new - x_old)
if error < tolerance:
print(f"Converged after {iteration + 1} iterations!")
break # Exit the loop early
x_old = x_new # Prepare for next iteration
The break statement exits the loop immediately when convergence is achieved. Without it, you’d waste time on unnecessary iterations.
Numerical Methods: Bracket Checking for Root Finding#
Before starting the bisection method, you need to verify that your interval actually contains a root. The key insight: if a function changes sign between two points, there must be a root somewhere between them.
f_a = f(a) # Function value at left endpoint
f_b = f(b) # Function value at right endpoint
if f_a * f_b < 0:
print("Good bracket! A root exists between a and b.")
elif f_a * f_b > 0:
print("Bad bracket. No sign change detected.")
else:
print("Lucky! One endpoint is exactly a root.")
Why does f_a * f_b < 0 work? If one value is positive and the other is negative, their product is negative. This is a classic trick you’ll use in bisection and false-position methods.
Chemical Engineering Example: Reaction Feasibility#
delta_G = -50.2 # Gibbs free energy, kJ/mol
if delta_G < 0:
print("Reaction is spontaneous (favorable)")
elif delta_G == 0:
print("Reaction is at equilibrium")
else:
print("Reaction is non-spontaneous")
Numerical Methods Example: Quadratic Formula#
When implementing the quadratic formula, you need to check the discriminant (\(b^2 - 4ac\)) to determine what type of roots you’ll get. This is a great example of nested if/else:
import math
a, b, c = 1, -5, 6 # coefficients of ax² + bx + c = 0
discriminant = b**2 - 4*a*c
if discriminant > 0:
x1 = (-b + math.sqrt(discriminant)) / (2*a)
x2 = (-b - math.sqrt(discriminant)) / (2*a)
print(f"Two real roots: {x1}, {x2}")
elif discriminant == 0:
x = -b / (2*a)
print(f"One repeated root: {x}")
else:
print("Complex roots (discriminant < 0)")
Output:
Two real roots: 3.0, 2.0
You’ll encounter this exact pattern when solving the van der Waals equation of state for molar volume. It’s a cubic equation, and checking for root types helps you understand the physical behavior of the gas.
Common Mistake#
Warning
Use == for comparison, not = (assignment)!
# WRONG - This assigns, doesn't compare
if x = 5: # SyntaxError!
# CORRECT
if x == 5:
print("x is five")
Next Steps#
Now that your code can make decisions, it’s time to learn repetition. Continue to Loops to see how numerical methods use iteration to solve problems step by step.