5.4.10 · Coding › Scientific Computing (Python)
Almost har "sabse achha dhundo / root dhundo / data fit karo / resources allocate karo" problem essentially ek number space mein search karne tak reduce ho jaati hai jab tak ek condition satisfy na ho. scipy.optimize tumhe chaar specialized search engines deta hai:
minimize → ek scalar objective f ( x ) ko jitna ho sake chhota karo.
fsolve → woh x dhundo jahan F ( x ) = 0 ho (roots).
curve_fit → parameters choose karo taaki model data se match kare (least squares).
linprog → linear constraints ke under ek linear objective optimize karo.
Inka ek hi DNA hai: tum inhe ek function , ek starting guess dete ho, aur ye iterate karte hain.
Intuition Haath se kyun nahi solve karte?
Real objectives nonlinear, high-dimensional hote hain, aur unka koi closed-form solution nahi hota. Tum ∇ f = 0 set karke ek 50-parameter model ke liye algebraically solve nahi kar sakte. Isliye hum numerically iterate karte hain: kahin se shuru karo, local slope/curvature dekho, improvement ki taraf step lo, tab tak repeat karo jab tak step negligible na ho jaaye.
Poori family ek mathematical observation par bani hai: minimum par, gradient zero hota hai.
Definition Stationary point
x ∗ function f ka stationary point hai agar ∇ f ( x ∗ ) = 0 . Ek minimum ke liye additionally wahan Hessian H ka positive semi-definite hona bhi zaroori hai.
Yahi reason hai ki minimization aur root-finding secretly ek hi problem hai: minimizing f = finding a root of ∇ f . Alag APIs, ek hi skeleton.
fsolve ek multidimensional version use karta hai (Jacobian J , g ′ ki jagah aata hai): Δ = − J − 1 F . minimize methods jaise 'Newton-CG', 'BFGS' Hessian (ya uska approximation) use karte hain.
Definition Standard form linear program
min x c ⊤ x s.t. A u b x ≤ b u b , A e q x = b e q , l ≤ x ≤ u
ALAG TOOL KYUN: jab sab kuch linear hai, optimum hamesha feasible polytope ke ek corner (vertex) par hota hai. linprog is baat ka faayda simplex/interior-point se uthata hai — bahut faster aur globally optimal, koi starting guess nahi chahiye.
Ek linear objective ka constant gradient hota hai — ye region ke andar kabhi "flat" nahi hota. Toh tum constraint walls ke saath dhalkate rehte ho jab tak nahi reh jaate: ek vertex.
Worked example 1 — ek 2D bowl minimize karo
f ( x , y ) = ( x − 3 ) 2 + ( y + 1 ) 2 minimize karo (true min ( 3 , − 1 ) par).
from scipy.optimize import minimize
f = lambda v: (v[ 0 ] - 3 ) ** 2 + (v[ 1 ] + 1 ) ** 2
res = minimize(f, x0 = [ 0 , 0 ]) # x0 = starting guess
print (res.x) # ≈ [ 3., -1.]
print (res.fun) # ≈ 0
x0 kyun? Iterative methods ko ek seed chahiye. res.x kyun, res nahi? res ek OptimizeResult object hai; .x solution rakhta hai, .fun minimum value, .success convergence flag.
Worked example 2 — ek nonlinear system fsolve karo
x 2 + y 2 = 25 aur x − y = 1 solve karo.
from scipy.optimize import fsolve
def F (v):
x, y = v
return [x ** 2 + y ** 2 - 25 , x - y - 1 ] # each eqn = 0
sol = fsolve(F, x0 = [ 1 , 1 ])
print (sol) # ≈ [4., 3.]
-25 aur -1 kyun likhte hain? fsolve wahan dhundhta hai jahan returned vector zero ke barabar ho, isliye sab kuch ek side le jaate hain. x0 kyun matter karta hai? Ek alag seed (jaise [-5,-5]) doosre root ( − 3 , − 4 ) par converge karta hai.
Worked example 3 — ek exponential curve_fit karo
y = a e − b x ko noisy data par fit karo.
import numpy as np
from scipy.optimize import curve_fit
model = lambda x, a, b: a * np.exp( - b * x)
x = np.linspace( 0 , 4 , 50 )
y = 2.5 * np.exp( - 1.3 * x) + 0.05 * np.random.randn( 50 )
popt, pcov = curve_fit(model, x, y, p0 = [ 1 , 1 ])
print (popt) # ≈ [2.5, 1.3]
print (np.sqrt(np.diag(pcov))) # 1σ uncertainty on a,b
p0 kyun? Nonlinear models ke liye ek starting guess divergence rokta hai. pcov kyun? Iska diagonal parameter variances deta hai — free error bars.
Worked example 4 — linprog allocation
Profit 40 x 1 + 30 x 2 maximize karo with x 1 + x 2 ≤ 40 , 2 x 1 + x 2 ≤ 60 , x ≥ 0 .
from scipy.optimize import linprog
# linprog MINIMIZES, so negate c to maximize
c = [ - 40 , - 30 ]
A_ub = [[ 1 , 1 ],[ 2 , 1 ]]
b_ub = [ 40 , 60 ]
res = linprog(c, A_ub = A_ub, b_ub = b_ub, bounds = [( 0 , None ),( 0 , None )])
print (res.x) # ≈ [20., 20.]
print ( - res.fun) # profit = 1400
c negate kyun karte hain? linprog sirf minimize karta hai; c ⊤ x maximize karna = − c ⊤ x minimize karna. bounds kyun? x ≥ 0 encode karta hai (default [ 0 , ∞ ) hai lekin explicitly likhna better hai).
Common mistake "fsolve ne galat/koi solution nahi dhundha — function broken hai."
Kyun sahi lagta hai: math sahi hai, toh code ko answer dhundhna chahiye .
Sach: fsolve local hai — ye x0 ke sabse paas wale root par converge karta hai, ya diverge karta hai. Fix: kai starting points try karo; res, info, ier, msg = fsolve(F, x0, full_output=True) check karo aur ier==1 inspect karo.
Common mistake Ye bhool jaana ki linprog minimize karta hai.
Kyun sahi lagta hai: "optimize" symmetric lagta hai. Sach: ye hamesha minimize karta hai. c negate kiye bina maximize karna sabse bura plan deta hai. Fix: f maximize karo ⇒ c = -f_coeffs pass karo, aur -res.fun report karo.
Common mistake Nonlinear model par
p0 ke bina curve_fit karna.
Kyun sahi lagta hai: linear np.polyfit ko koi guess nahi chahiye. Sach: nonlinear least squares non-convex hai; bure default seeds → garbage ya runtime error. Fix: physically sensible p0 do.
Common mistake Equations aur objectives ko confuse karna.
Equations ka system minimize ko pass karna (ye unka sum minimize karega, zero nahi) ya scalar cost fsolve ko pass karna. Fix: roots → fsolve; smallest value → minimize.
Recall Feynman: 12-saal ke bachche ko explain karo
Socho tum ek pahaadi maidan mein aankhon par patti baandhke ho aur sabse nichla point chahiye. Tum feel karte ho ki zameen kis taraf jhuki hai aur ek step neechay lete ho, baar baar — yahi minimize hai. Agar iske bajaay tum woh jagah chahte ho jahan zameen exactly samudra ke level par bilkul flat ho, toh yahi fsolve ek zero dhundhna hai. curve_fit aisa hai jaise ek stretchy string ko bikhari hui dots ke opar se jitna ho sake snugly guzaaro. linprog ek shahar jaisa hai jisme seedhi sadkein hain aur ek "sabse nichla" corner hai — tum bas walls ke saath chalte ho sabse achhe corner tak. Har baar ek hi idea: tab tak step karte raho jab tak improve na kar sako.
"My Friend Can't Lie" →
M inimize (sabse chhoti value) · F solve (zeros dhundo) · C urve_fit (data fit karo) · L inprog (linear corners).
scipy.optimize.minimize kya minimize karta hai?Ek scalar objective f ( x ) , woh x return karta hai jo sabse chhoti value deta hai.
Minimization aur root-finding ek hi problem kyun hain? f minimize karna = uske gradient ∇ f = 0 ka root dhundhna.
g ( x ) = 0 ke liye Newton update derive karo.g ( x k + Δ ) ≈ g ( x k ) + g ′ ( x k ) Δ = 0 linearize karo ⇒ x k + 1 = x k − g ( x k ) / g ′ ( x k ) .
curve_fit residuals ko square kyun karta hai? Squares errors ko positive rakhte hain (koi cancellation nahi) aur Gaussian noise ke under maximum-likelihood fit dete hain.
linprog se MAXIMIZE karne ke liye kya change karna hota hai? Cost vector c negate karo (aur true value ke liye -res.fun report karo); linprog sirf minimize karta hai.
LP optimum ek vertex par kyun hota hai? Ek linear objective ka constant gradient hota hai, isliye ye feasible polytope ke corner tak improve karta rehta hai.
OptimizeResult mein solution vs value kaunse attribute mein hota hai? .x solution hai, .fun objective value hai, .success convergence flag hai.
fsolve kabhi kabhi "galat" root kyun deta hai? Ye ek local method hai — ye x0 ke sabse paas wale root par converge karta hai; doosre roots ke liye seed change karo.
curve_fit se pcov ka diagonal kya deta hai? Fitted parameters ke variances; sqrt(diag(pcov)) 1σ uncertainties hain.
Equations ke system ke liye fsolve vs minimize kab use karo? fsolve system ko zero banane ke liye; minimize tabhi jab genuinely ek scalar ki sabse chhoti value chahiye.
minimizing f = root of grad f
minimized by Levenberg-Marquardt
Stationary point grad f = 0
minimize scalar objective
Least-squares objective S theta