Price elasticity of demand midpoint calculator
When the price rises from 10 to 12 and the quantity bought falls from 100 to 80, the midpoint method gives an absolute elasticity above 1, so demand is elastic. The answer is the same in either direction. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- P1
- 10
- Q1
- 100
- P2
- 12
- Q2
- 80
- Delta p
- 2
- Delta q
- -20
- Midpoint p
- 11
- Midpoint q
- 90
Price elasticity of demand measures how strongly buyers change the quantity they purchase when the price moves. The midpoint method—also called the arc elasticity formula—averages the two prices and the two quantities so the percent-change denominators stay the same whether you step from A to B or from B to A. That symmetry makes homework keys, exam oracles, and pricing notebooks agree on a single number instead of two direction-dependent point elasticities. This price elasticity of demand midpoint calculator accepts initial and new price–quantity pairs, applies the standard arc formula, returns signed elasticity plus its absolute value, and labels demand as elastic, inelastic, or unit elastic so students and analysts can read the economic meaning at a glance without re-deriving thresholds by hand.
Midpoint (arc) formula and why it beats simple percent change
The midpoint price elasticity of demand is the ratio of the percent change in quantity to the percent change in price, where each percent change uses the average of the two observations as its base. In symbols, percent change in quantity equals (Q2 minus Q1) divided by the midpoint quantity (Q1 plus Q2) over two, and percent change in price equals (P2 minus P1) divided by the midpoint price (P1 plus P2) over two. Elasticity E_d is then percent change in quantity divided by percent change in price.
Using averages removes the classic asymmetry of the elementary percent-change formula: with ordinary base-period percentages, a move from ten to twelve dollars is a twenty percent rise, while the reverse is about sixteen point seven percent, so elasticity would flip depending on which point you call start. The arc formula always divides by eleven for that price pair, so the magnitude is path-independent.
For a normal downward-sloping demand curve, quantity falls when price rises and the signed elasticity is negative; textbooks and dashboards often discuss the absolute value when they say demand is elastic or inelastic.
Where midpoint PED earns its keep in study and product work
Introductory microeconomics courses assign midpoint elasticity problems precisely because the arc method is the grading key on most multiple-choice and free-response rubrics. Tutoring platforms and LMS plugins need a deterministic oracle that classifies elastic versus inelastic without student-side spreadsheet drift. Product and revenue teams comparing two observed price points from an A/B test or a regional price change want the same arc number analysts compute in slides, not a one-sided point elasticity that depends on which row is the baseline.
Pin the rounded fields in tests, reject zero price change and zero quantity sum explicitly, and you get reproducible PED figures for homework, exam generators, and lightweight pricing notebooks without standing up a full econometrics stack.
What you can do with it
Homework and exam midpoint PED checks
Students enter two price–quantity points and verify signed elasticity, absolute value, and elastic / inelastic / unit labels against textbook midpoint solutions.
LMS and tutoring auto-grading
Score arc-elasticity items with a deterministic oracle that rejects equal prices and zero quantity midpoints as invalid instead of inventing infinity.
Pricing notebooks and A/B price tests
Compute path-independent PED between two observed store or region price points without hand-building midpoint denominators in a spreadsheet.
FAQ
What is the midpoint price elasticity of demand formula?
E_d = ((Q2−Q1)/((Q1+Q2)/2)) / ((P2−P1)/((P1+P2)/2)). The averages make the result the same in either direction between the two points.
How does the calculator classify elastic, inelastic, or unit elastic?
It uses the absolute value of elasticity: |E|>1 elastic, |E|=1 unit elastic (within float tolerance), |E|<1 inelastic. The signed elasticity is also returned.
Why must p1 and p2 be different?
Zero price change makes the percent change in price zero, so elasticity is undefined.
Can quantities be zero?
A single quantity may be zero, but Q1+Q2 must be positive so the midpoint quantity is a valid base for percent change.
Why use the midpoint method instead of a simple percent change?
Because it gives the same answer in both directions. Going from 10 to 12 and from 12 to 10 both divide by the average price of 11, so the elasticity no longer depends on which point you call the start.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/econ/price-elasticity-demand-midpoint \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"p1":10,"q1":100,"p2":12,"q2":80}'const res = await fetch("https://api.kit.forhosting.com/econ/price-elasticity-demand-midpoint", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"p1": 10,
"q1": 100,
"p2": 12,
"q2": 80
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/econ/price-elasticity-demand-midpoint",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"p1": 10,
"q1": 100,
"p2": 12,
"q2": 80
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/econ/price-elasticity-demand-midpoint", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"p1":10,"q1":100,"p2":12,"q2":80}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"p1":10,"q1":100,"p2":12,"q2":80}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/econ/price-elasticity-demand-midpoint", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"p1": 10,
"q1": 100,
"p2": 12,
"q2": 80
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "econ.price_elasticity_demand_midpoint",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Midpoint (arc) formula and why it beats simple percent change
This endpoint returns both the signed elasticity and elasticity_abs so you can keep the law-of-demand sign for analysis and still map cleanly to classroom language that talks about magnitudes greater than, equal to, or less than one.
Inputs, outputs, classification rules, and validation
Send four finite numbers: p1 and q1 for the first observation, p2 and q2 for the second. Prices must be strictly positive; quantities must be non-negative; the two prices must differ; and the sum of the two quantities must be positive so the midpoint quantity is not zero. Equal prices make the price percent change zero and are rejected as undefined rather than returning infinity. Example: p1 equals ten, q1 equals one hundred, p2 equals twelve, q2 equals eighty yields a midpoint price of eleven, midpoint quantity of ninety, percent changes of two elevenths and negative two ninths, and an absolute elasticity above one, so demand is labeled elastic. Fields may arrive as JSON numbers or numeric strings; missing, empty, or non-finite values fail with invalid_input naming the field. On success the response echoes the four inputs and adds delta_p, delta_q, midpoint_p, midpoint_q, percent_change_p, percent_change_q, elasticity, elasticity_abs, classification, and a short formula string. Classification uses the absolute elasticity: greater than one is elastic, equal to one within a tight floating-point tolerance is unit_elastic, and less than one is inelastic. Another textbook pair with p1 equals two, q1 equals four, p2 equals four, q2 equals two yields absolute elasticity exactly one and classification unit_elastic. Failed validation is not billed; successful parse calls use the published $0.002 base price.
Technical questions
What does the price elasticity of demand midpoint calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.