Numpy pakken bruges til matematik og matplotlib bruges til at plotte data. Numpy indeholder de fleste matematiske funktioer, alt fra sin cos til lineær algebra.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10,10,100)
y = np.sin(x)
plt.plot(x,y)
Linjen x = np.linspace(-10,10,100) er fuldstandig genialt. Den bruger numpy til at generere en liste med 100 equally spaced værdier fra -10 til 10.
Prøv at lege med linspace argumenterne for at se hvordan grafen forandrer sig.
Her ser du sinus funktionen plottet med koden til venstre. Er du interesseret i aksebetegnelser, overskrifter af dine grafer og andet godt så klik på denne her side. Mulighederne for at tilpasse grafen og udseende af den er uendelige. Jeg vil på denne side prøve at minimere unødvendig kode og fokusserer på matematikken.
Her skal man definere funktionen enten direkte med "def" eller bruge lambda funktionen.
from scipy import integrate
x2 = lambda x: x**2
integrate.quad(x2, 0, 4)
eller som vi er vant til:
import scipy as sc
x2 = lambda x: x**2
sc.integrate.quad(x2, 0, 4)
integrate leverer to løsninger
den første er selve værdien
sc.integrate.quad(x2,0,4)[0]
den anden er usikkerheden på beregningen
sc.integrate.quad(x2,0,4)[1]
Eller lidt pænere
import scipy as sc
def integrand(x, a, b):
return a*x**2 + b
a = 1
b = 0
I = sc.integrate.quad(integrand,0,4,args=(a,b))
I
Integral af funktionen til højre fra 0 til 1
import scipy.integrate
import matplotlib.pyplot as plt
import numpy as np
f = lambda x:np.exp(-x**2)
i = scipy.integrate.quad(f, 0, 1)
print(i[0]) #i[0] = værdien af integralet
#plotte funktionen (unødvendigt men smukt)
x = np.linspace(0,1,100)
y = f(x)
plt.plot(x,y)
Integralet af f(x) fra -10 til 10 med plot
import scipy.integrate
import matplotlib.pyplot as plt
import numpy as np
start = -10
slut = -start
f = lambda x:np.exp(-x**2)
i = scipy.integrate.quad(f, start, slut)
print('værdien af integralet er : ', i[0])
x = np.linspace(start,slut,10000)
y = f(x)
plt.plot(x,y)
Lidt mere avanceret kan det gøres. Her finder programmet skæringspunktet og tegner to linjer igennem den.
Du definerer to funktioner f og g. Det antages at g(starten) > f(starten) Hvis ikke det er tilfælde (se plottet) så skal du bytte tegnet ud i denne statement
if y[i] > z[i]: bliver til if y[i] < z[i]:
**********************
import scipy.integrate
import matplotlib.pyplot as plt
import numpy as np
## Angiv dine værdier
xstart = -3 #start integrationen og plot her
xslut = 3 #slut integration og plot her
f = lambda x:np.exp(-x**2)*10 # første funktion
g = lambda x: 2*x**2+0.4 # anden funktion
#f = lambda x:np.sin(x) # første funktion
#g = lambda x: 2*x**2-0.4 # anden funktion
## her til
## hvis g(xstart) er mindre end f(xstart) skal > ændres til <
interval = xslut - xstart
i = scipy.integrate.quad(f, xstart, xslut)
j = scipy.integrate.quad(g, xstart, xslut)
print('værdien af integralet for f(x) er : ', i[0])
print('værdien af integralet for g(x) er : ', j[0])
x = np.linspace(xstart,xslut,10000)
y = f(x) #blå
z = g(x) #gul
skaer=0
#find det første skæringspunkt (virker kun hvis g starter med at være større end f)
for i in range(len(x)):
if y[i] > z[i]:
skaer = xstart+i/(len(x))*interval
break
#herfra er det print og plot
print('skæringsværdien er ved i = ',skaer)
print('y værdien ved skæringen er ', y[i])
print('z værdien ved skæringen er ', z[i])
minlegende=("x,y(skær 1) = {0}, {1} ".format(round(skaer,4),y[i].round(4)))
plt.plot(x,y,label='f(x)')
plt.plot(x,z,label='g(x)')
plt.title(minlegende)
plt.legend()
plt.axhline(y=y[i],color='k',linestyle='--',lw=1)
plt.axvline(x=skaer,color='k',linestyle='--',lw=1)
plt.xlabel('x-værdier')
#plt.grid()
plt.show()
Her nedenunder ser du pythons output på skærmen.
Integralværdierne er 17,72 og 38,40 i de angivne grænser.