📖 Scenario: You are helping a small business find the best price to maximize their profit. They have a simple profit function that depends on the price. You will use different methods to find the price that gives the highest profit.
🎯 Goal: Learn how to use three optimization methods: Nelder-Mead, BFGS, and Powell from scipy.optimize.minimize to find the best price that maximizes profit.
📋 What You'll Learn
Create a profit function that depends on price
Set an initial guess for the price
Use scipy.optimize.minimize with methods Nelder-Mead, BFGS, and Powell
Print the best price and maximum profit found by each method
💡 Why This Matters
🌍 Real World
Businesses often need to find the best price or settings to maximize profit or minimize cost. Optimization methods help find these values efficiently.
💼 Career
Data scientists and analysts use optimization techniques to solve real problems in pricing, resource allocation, and machine learning model tuning.
Progress0 / 4 steps
1
Create the profit function
Create a function called profit that takes a single variable price and returns the negative of the profit calculated as -(price * (100 - 2 * price)). This means profit = price times (100 minus 2 times price), and we negate it because scipy.optimize.minimize finds minimum values.
SciPy
Hint
Think of profit as price times quantity sold. Quantity decreases as price increases. We use negative because the optimizer finds minimum, but we want maximum profit.
2
Set the initial guess for price
Create a variable called initial_price and set it to 10. This is the starting point for the optimization methods.
SciPy
Hint
Just create a variable named initial_price and assign it the value 10.
3
Use optimization methods to find best price
Import minimize from scipy.optimize. Use minimize three times with the profit function and initial_price. Use methods 'Nelder-Mead', 'BFGS', and 'Powell'. Save the results in variables result_nm, result_bfgs, and result_powell respectively.
SciPy
Hint
Use minimize(profit, initial_price, method='MethodName') for each method and save the results.
4
Print the best price and maximum profit from each method
Print the best price and maximum profit found by each method. Use result_nm.x[0], result_bfgs.x[0], and result_powell.x[0] for prices. Calculate profit by calling -profit(price) because profit function returns negative. Print results with labels: 'Nelder-Mead', 'BFGS', and 'Powell'.
SciPy
Hint
Use print(f"Method best price: {result.x[0]:.2f}, max profit: {-profit(result.x[0]):.2f}") for each result.
Practice
(1/5)
1. Which optimization method in scipy.optimize.minimize should you choose if you do NOT have information about the slope (gradient) of the function?
easy
A. BFGS
B. Nelder-Mead
C. Powell
D. CG
Solution
Step 1: Understand slope information requirement
BFGS requires slope (gradient) information, while Nelder-Mead and Powell do not.
Step 2: Identify method without slope info
Nelder-Mead is designed for optimization without slope info, making it suitable here.
Final Answer:
Nelder-Mead -> Option B
Quick Check:
No slope info = Nelder-Mead [OK]
Hint: No slope info? Pick Nelder-Mead [OK]
Common Mistakes:
Choosing BFGS without slope info
Confusing Powell with BFGS
Assuming CG works without slope info
2. Which of the following is the correct way to specify the Powell method in scipy.optimize.minimize?
easy
A. minimize(fun, x0, method='Powell')
B. minimize(fun, x0, method='powl')
C. minimize(fun, x0, method='POWELL')
D. minimize(fun, x0, method='powell')
Solution
Step 1: Check method name case sensitivity
Method names in scipy.optimize.minimize are case-sensitive and lowercase.
Step 2: Match exact method string
The correct string is 'powell' all lowercase, so minimize(fun, x0, method='powell') is correct.
Final Answer:
minimize(fun, x0, method='powell') -> Option D
Quick Check:
Method name is lowercase 'powell' [OK]
Hint: Method names are lowercase strings [OK]
Common Mistakes:
Using uppercase method names
Typo in method string
Using partial method names
3. What will be the output of the following code snippet?
from scipy.optimize import minimize
def f(x):
return (x[0]-3)**2 + (x[1]+1)**2
result = minimize(f, [0, 0], method='BFGS')
print(round(result.x[0], 1), round(result.x[1], 1))
medium
A. (3.0, -1.0)
B. (0.0, 0.0)
C. (3.0, 1.0)
D. Error due to missing gradient
Solution
Step 1: Understand the function and starting point
The function has minimum at x=3, y=-1. Starting point is [0,0].
Step 2: BFGS uses gradient approximation to find minimum
BFGS will find the minimum near (3, -1) accurately.
Final Answer:
(3.0, -1.0) -> Option A
Quick Check:
Minimum at (3,-1) found by BFGS [OK]
Hint: BFGS finds minimum near true minimum fast [OK]
Common Mistakes:
Assuming output is starting point
Thinking gradient is required explicitly
Confusing signs in minimum location
4. Identify the error in this code snippet using Nelder-Mead method:
from scipy.optimize import minimize
def f(x):
return x**2 + 4*x + 4
result = minimize(f, 2, method='Nelder-Mead')
print(result.x)
medium
A. Initial guess must be a list or array, not a scalar
B. Function must return a vector, not scalar
C. Method 'Nelder-Mead' is not supported
D. Missing gradient function
Solution
Step 1: Check input type for initial guess
Minimize expects initial guess as array-like, but 2 is scalar.
Step 2: Confirm correct input format
Passing [2] or np.array([2]) fixes the error.
Final Answer:
Initial guess must be a list or array, not a scalar -> Option A
Quick Check:
Initial guess scalar causes error [OK]
Hint: Initial guess must be array-like, not single number [OK]
Common Mistakes:
Passing scalar initial guess
Expecting gradient for Nelder-Mead
Wrong method name casing
5. You want to minimize a function where you have no gradient info, but the function is noisy and non-smooth. Which method is best to try first in scipy.optimize.minimize?
hard
A. BFGS
B. Nelder-Mead
C. Powell
D. Newton-CG
Solution
Step 1: Analyze method suitability for noisy, non-smooth functions
BFGS and Newton-CG require gradient info and smoothness, so not ideal.
Step 2: Compare Nelder-Mead and Powell for robustness
Powell is more robust for noisy, non-smooth functions without gradients.
Final Answer:
Powell -> Option C
Quick Check:
No gradient + noisy function = Powell [OK]
Hint: No gradient + noisy? Use Powell method [OK]
Common Mistakes:
Choosing BFGS without gradient
Assuming Nelder-Mead is always best
Ignoring function noise impact
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.