Curve fitting med 1/x och sqrt(x) kurva i Matlab - Hur?

Permalänk

Curve fitting med 1/x och sqrt(x) kurva i Matlab - Hur?

Hej.

Ska göra linjäranpassning av graf som har antingen 1/x eller sqrt(x) kurva. Man kan inte köra polyfit(x,y,n) n= grad. pga. polyfit endast använder positiva tal. Hur göra?

Basic fitting använder också endast positiva grader.

Permalänk
Moderator
Moderator

*Tråd flyttad.*

Visa signatur

*-<|:C-<-<

Nytt namn, samma bismak.

Permalänk
Medlem

duger minstakvadrat?

A*k = Y
med:

A=[ 1, 1/x0; 1, 1/x1; ... 1, 1/xn] Y =[ y0; y1; ... yn]

lös sedan för x (http://se.mathworks.com/help/matlab/ref/mldivide.html)
k = A\Y
så har du dina konstanter framför termerna... dvs
k0*1 + k1*1/x = y

felskrivning / istället för \
Visa signatur

weeeee

Permalänk
Medlem

Syntax skiljer lite men med numpy i Python så fungerar det ungefär enligt länken nedan:
http://nbviewer.ipython.org/gist/mounte/f9608da3c35539098195

Visa signatur

weeeee

Permalänk
Skrivet av mounte:

duger minstakvadrat?

A*k = Y
med:

A=[ 1, 1/x0; 1, 1/x1; ... 1, 1/xn] Y =[ y0; y1; ... yn]

lös sedan för x (http://se.mathworks.com/help/matlab/ref/mldivide.html)
k = A/Y
så har du dina konstanter framför termerna... dvs
k0*1 + k1*1/x = y

Tack för svaret, men jag förstår inte riktigt. Är helt nybörjare på matlab.

När jag linjäriserar med värden med polyfit har jag skrivit:

x = [4 5 6];
y = [0.32 0.26 0.22];
p = polyfit (x0, y0, 1)
xp = linspace(3, 7);
yp = polyval(p, xp);
plot(x, y, 'o', xp, yp)

Enligt din kod så är är A=x eller?
Jag ska inte få ut en ekvation utan ska bara få en linje som går genom punkterna så jag kan se vilken sorts kurva som passar bäst.

Med koderna (heter det så) jag har skrivit får jag 2 kurvor där ena är den aktuella plottade värdet och det andra heldragna linjen en linjärisering.

Permalänk
Medlem

Jag antar att du har dina datapunkter (x_0, y_0), (x_1, y_1), ... (x_n, y_n)
Du antar/vet att det finns ett samband mellan x och y enligt formen:
y = f(x) = k0 + k1/x
du vill nu hitta de bästa parametrarna k0 och k1 som passar punkterna bäst mot funktionen (modellen).

Genom matrisen

A=[ 1, 1/x0; 1, 1/x1; ... 1, 1/xn]

så kan vi se att om vi multiplicerar den med kolonnvektorn k=[k0; k1]
så får vi, rad för rad:

1*k0 + 1/x0*k1
1*k0 + 1/x1*k1
1*k0 + 1/x2*k1
...
1*k0 + 1/xn*k1

detta är vårt vänsterled.
högerledet består endast av våra y:
y0
y1
y2
...
yn

vi har således beskrivit problemet som ett ekvationssystem med 2 obekanta (k0, k1) och n st ekvationer.
På matrisform:
A*k = Y
Detta är överbestämt och därför använder vi minstakvadrat-metoden för att finna en lösning genom att använda pseudoinversen till
pinv(A)*A*k = pinv(A)*Y
k = pinv(A)*Y
eller som matlab uttrycker det med backslash-operatorn
k = A\Y

http://se.mathworks.com/help/matlab/math/systems-of-linear-eq...

Visa signatur

weeeee

Permalänk
Medlem

Vad exakt är det för problem du stöter på med polyfit? Här har jag modifierat din kod och linjäranpassar kurvan 1/x.

clear all x = 1:100; y = 1./x; p = polyfit (x, y, 8) xp = linspace( 1, 100); yp = polyval(p, xp); plot(x, y, 'o', xp, yp)

Det krävs troligtvis en högre grad än 8 för att få perfekt anpassning.

Det mounte skriver stämmer också så vitt jag vet. Jag tror till och med att matlab utför någon slags MK-skattning eftersom "help polyfit" returnerar

This MATLAB function returns the coefficients for a polynomial p(x) of degree n that is a best fit (in a least-squares sense) for the data in y.

Mvh Swing3r