Viidennen viikon tehtävät
Varsinkin laboratoriotöissä haluamme usein sovittaa dataan suoran tai käyrän, sekä tietää sen yhtälön. Pythonin avulla tämä käy nopeasti hyödyntämällä pienimmän neliösumman menetelmää. Wikipedia kertoo asiasta näin: "Pienimmän neliösumman menetelmässä regressiokertoimien estimaattorit määrätään minimoimalla jäännös- eli virhetermien neliösumma. Saaduilla estimaateilla voidaan siten muodostaa estimoitu regressiosuora, eli malli kuvaamaan selitettävän muuttujan vaihtelua. "
Pythonin leastsq-funktiota joka käyttää PNS-menetelmää kutsutaan seuraavasti:
def residuals(param, xdata, ydata):
return ydata - (param[0] + param[1]*xdata)
def main():
x0 = np.array([0,0])
tu = leastsq(residuals, x0, args=(xdata, ydata))
Leastsq vaatii siis residuals funktion (joka laskee virhetermit), alkuarvauksen sekä argumenteiksi dataa. Nyt saamme sovitetun funktion seuraavalla tavalla:
def residuals(param, xdata, ydata):
return ydata - (param[0] + param[1]*xdata)
def main():
x0 = np.array([0,0])
tu = leastsq(residuals, x0, args=(xdata, ydata))
yfit = tu[0] #Saadut parametrit
fitFunc = yfit[0] + yfit[1]*xdata
fitFuncin voimme plotata hyödyntämällä pyplottia.
Tehtäväpohja on seuraavanlainen:
def func(param, xdata, ydata):
return ydata - (param[0] + param[1]*xdata)
def main():
Tehtävänäsi on käyttää SciPyn Least square-funktiota ja tehdä laboratoriosta saatuun dataan suoran sovitus. Data löytyy tiedostosta input.dat. Datassa ensimmäinen sarake on virta ja toinen sarake on jännite. Ratkaiset siis resistanssia. Muista tulostaa saamasi kulmakerroin, jotta tarkistus menee läpi!
R = 0.56
Tehtäväpohja on seuraavanlainen:
def main():
#Generate random data
xdata = np.linspace(0,4,50)
y_noise = 0.2 * np.random.normal(size=xdata.size)
ydata = 3*xdata + y_noise
Tehtävänäsi on käyttää SciPyn Least square-funktiota ja tehdä suoran sovitus generoituun dataan. Suora tulee olla muotoa ax + b. Muista tulostaa saamasi parametrit, jotta tarkistus menee läpi!
[-0.04193429 3.00553665]
Tehtäväpohja on seuraavanlainen:
def main():
#Generate random data
xdata = np.linspace(-3,7,75)
y_noise = 0.5 * np.random.normal(size=xdata.size)
ydata = xdata**2 + y_noise
Tehtävänäsi on käyttää SciPyn Least square-funktiota ja tehdä muotoa ax^2 + b oleva sovitus generoituun dataan. Sinun täytyy myös toteuttaa sovitusfunktio (residuals) itse. Muista tulostaa saamasi parametrit, jotta tarkistus menee läpi!
[-0.02469396 0.99438934]
Tehtäväpohja on seuraavanlainen:
def main():
#Generate random data
xdata = np.linspace(0,2*np.pi,100)
y_noise = 0.2 * np.random.normal(size=xdata.size)
ydata = np.sin(xdata) + np.cos(xdata) + y_noise
Tehtävänäsi on käyttää SciPyn Least square-funktiota ja tehdä muotoa Asin(x) + Bcos(x) oleva sovitus generoituun dataan. Sinun täytyy myös toteuttaa sovitusfunktio (residuals) itse. Muista tulostaa saamasi parametrit, jotta tarkistus menee läpi!
[ 1.00423816 0.99764248]
Tehtäväpohja on seuraavanlainen:
def main():
#Generoidaan random dataa
xdata = np.linspace(0,4,50)
y = func(xdata, 2, 3, 1)
y_noise = 0.2 * np.random.normal(size=xdata.size)
ydata = y + y_noise
Tehtävänäsi on käyttää SciPyn Curve fit-funktiota ja tehdä sovitus a*e^(-b*x) + c generoituun dataan. Sinun täytyy myös toteuttaa sovitusfunktio (residuals) itse. Muista tulostaa saamasi parametrit, jotta tarkistus menee läpi! Curve fit ei kuulu luentomateriaaliin, mutta Googlesta voi olla apua :)
[ 1.7763289 3.02012127 1.06947269]