%load_ext sympy.interactive.ipythonprinting
import numpy as np
from matplotlib import pyplot as plt
from sympy import *
points = [(-1, 0), (0, -2), (0, -1), (1, 1)]
a, b, c = symbols("a b c")
f = lambda x, y: (y - (a*x**2 + b*x + c))**2
J = sum(f(*p) for p in points)/2
J
da = diff(J, a)
da
db = diff(J, b)
db
dc = diff(J, c)
dc
sols = solve([da, db, dc], [a, b, c])
a = sols[a].evalf()
a
b = sols[b].evalf()
b
c = sols[c].evalf()
c
xs = np.linspace(-1.5, 1.5, 1000)
ys = a*xs**2 + b*xs + c
pxs, pys = zip(*points)
plt.xlim(-1.5, 1.5)
plt.ylim(-2.5, 1.5)
plt.plot(xs, ys)
plt.plot(pxs, pys, ".")
[Line2D(_line1)]