NLP Optimization: bounded supply function in a trade model

Problems with modeling
Post Reply
Hendrik Mahlkow
Posts: 3
Joined: 2 years ago

NLP Optimization: bounded supply function in a trade model

Post by Hendrik Mahlkow » 2 years ago

Dear ladies and gentleman,

I am an economist and new to modeling and programming. Please be forgiving with my lack of mathematical language.

I work on a simple non-linear trade model which derives prices and price changes, based on exogenous market shocks. For simplicity reasons right now the model only has two commodities (i) with no cross price elasticity and one region (j).

Code: Select all

         i  commodity    / cereals, rice /
         j  regions      / EUR / ;
The supply and demand functions are exponential.

Code: Select all

supply(i,j)..  qs(i,j) =e= a(i,j)*(1+s_shift(i,j))*p(i)**es(i,j);
demand(i,j)..  qd(i,j) =e= b(i,j)*p(i)**ed(i,j);
a(i,j) calibration parameter supply function / givven
b(i,j) calibration parameter demand function / given
es(i,j) supply elasticities / given
ed(i,j) demand elasticities / given
s_shift(i,j) supply shift (%) / given
p(i) = price / positive variable

The goal function is to maximize producer (PS) and consumer surplus (CS), which is the integral between demand and supply curve.

Code: Select all

objective..      goal =e= sum((i,j),PS(i,j)) + sum((i,j), CS(i,j));

prod_welf(i,j)..  PS(i,j) =e= qs(i,j)*p(i) - costs(i,j) ;
cons_welf(i,j)..  CS(i,j) =e= utility(i,j)- qd(i,j)*p(i) ;
cost_func(i,j)..  costs(i,j) =e= qs(i,j)*p(i) - a(i,j)/(es(i,j)+1)*(1+s_shift(i,j))*p(i)**(es(i,j)+1) ;
util_func(i,j)..  utility(i,j) =e= qd(i,j)*p(i) + b(i,j)/(ed(i,j)+1)*(pmax(i)**(ed(i,j)+1)- p(i)**(ed(i,j)+1));
After an exogenous production "shock" (shift of the supply curve) the nlp model finds a new market equilibrium (price and quantity). This works well.

Now I want to implement and supply constraint. The supply function should be "cut" at a given quantity (picture 1: q0 max). No more than this maximum quantity could be supplied. If a shock hits the market, the cropped supply function is shifted (Q1 supply). The new maximum quantity that could be supplied can't be bigger than "q0 max * (1 + s_shift)". If this quantity constrains the solution then q1 = q0 max * (1 + s_shift).
picture 1.jpg
Therefore I wrote a supply bound into the equations.

Code: Select all

supply_bound(i,j).. qs(i,j) =l= qs0(i,j)*(1 + s_shift(i,j) + stock(i,j))
s_shift = supply shift
stock = additional storage capacity
qs0 * (1 + stock) = q0 max in picture 1

This supply_bound successfully limits the maximum quantity. But if the supply_bound constrains the solution space my model doesn't find the right price (p1 in picture 1). It can not find a feasible solution anymore.

Right now the model does not calculate consumer and producer surplus right. Picture 2 shows the right solution. But my model cancels out the quantity (qd, qs) when consumer surplus and producer surplus is calculated. It comes out with the price p2 (picture 3 is integrated into the next post) and integrates the deadweight loss into his goal function. Mathematically this makes sense, because the area between the functions is bigger than in picture 2, but the implied quantity is outside of the solution space.
picture 2.jpg
Is there a way implement different "sections" into one equation? E.g. between q = 0 and q < q max take this equation (q = a * p ^ es) with es = 0.3 and after q > q max (q = a * p ^ es) with es = 0.0001.
For q > q max the function would be almost vertical but the solver could still find a maximum. The price would increase drastically for q > q max while the quantity would only increase marginal.

If I could implement different "sections" into my supply equation, I maybe don't need to change the goal function.

I attached the original GAMS code "simple trade model.gms". A shock of minus 20% (s_shift = -0.2) to the initial supply of cereals (500 units) and no additional storage capacity (stock = 0) will result in a maximum supply quantity of 400 units. If I'm not wrong the right cereals price should be around 246. Instead the model does not change the price...

Thank you very much for your attention. Any hint or contribution is highly appreciated.

simple trade model.gms
(4.38 KiB) Downloaded 91 times
Last edited by Hendrik Mahlkow 2 years ago, edited 1 time in total.

Post Reply