In [77]:
%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
f = lambda x: x**2-x-2
g = lambda x: x**3-2*x**2-3*x+1
fig, ax = plt.subplots()
x = np.linspace(-2,4)
ax.fill_between(x, f(x),g(x),where = f(x)>=g(x), facecolor='green',interpolate=True)
ax.fill_between(x, f(x), g(x), where = f(x)<= g(x),facecolor='red',interpolate=True)
plt.title("Liki med dvema krivuljama.")
Out[77]:
Krivulji omejujeta dva lika. Meje za integracijo izračunamo tako, da poiščemo presečišča.
In [65]:
import sympy as sym
sym.init_printing()
x = sym.Symbol('x')
enacba = sym.Eq(f(x),g(x))
enacba
Out[65]:
In [66]:
sym.solve(enacba,x)
Out[66]:
Formule za presečišča so precej grda, zato bomo raje uporabili kar približke s števili s plavajočo vejico (float).
In [74]:
resitve = [x.evalf() for x in sym.solve(enacba,x)]
resitve
Out[74]:
Opazimo, da so rešitve kompleksne. Čudno! Ampak imaginarni del je zelo majhen. Očitno gre za zaokrožitveno napako, saj je na grafu lepo vindo, da so rešitve realne. Vzamemo le realni del.
In [75]:
resitve = [sym.re(x) for x in resitve]
resitve.sort()
resitve
Out[75]:
In [78]:
for i in range(len(resitve)):
xi = resitve[i]
ax.plot(xi,f(xi),'ko')
ax.annotate('$(x_%d,f(x_%d))$'%(i,i),xy = (xi,f(xi)),xytext=(xi,f(xi)-3))
fig
Out[78]:
In [87]:
x = sym.Symbol('x')
P = sym.integrate(g(x)-f(x),(x,resitve[0],resitve[1])) + sym.integrate(f(x)-g(x),(x,resitve[1],resitve[2]))
print("Skupna ploščina obeh likov je približno enaka %f" % P)
In [55]:
import disqus
%reload_ext disqus
%disqus matpy