Vinnaren i pepparkakshustävlingen!
2010-02-08, 23:21
  #1
Medlem
Hej,

Har följande problem: jag har en hög referensdata (talpar) som jag vill skapa en interpolerad kurva till. Jag har gjort ett försök med fourierinterpolation i den bifogade bilden: http://wintermute.csbnet.se/~zilog/fourierproblem.png , men som syns så svajar den röda linjen vilt mellan skärningarna med referenspunkterna. Detta blir värre ju längre högerut jag går i grafen.

Jag behöver ha den interpolerade datan till att linearisera utdatan från en temperaturmätning, där jag får ut resistans men vill omvandla till temperatur. Fenomenet är ytterst ickelinjärt, så samplad data är det enda jag har att lita på.

Det är viktigt att alla samplingspunkter (iaf de inom ett intervall kring mitten) skärs exakt. Jag har en känsla av att funktionen jag försöker att mappa mot påminner om 1/exp(-cx), så det vore bra om den resulterande interpoleringen inte skär en tänkt sådan linje onödigt många gånger.

Någon som har förslag på vad jag kan försöka med? Ett plus är ju såklart om komplexiteten inte är jättehög då jag har begränsad kraft i processorn jag kör reglerkoden i.
__________________
Senast redigerad av zilog 2010-02-08 kl. 23:28.
Citera
2010-02-08, 23:32
  #2
Medlem
evolutes avatar
Någon typ av spline-interpolation. Kanske räcker det med linjärt?

Annars kanske du kan fundera på fysiken och se om en kurvanpassning fungerar? Vill du lägga ut din data (dina talpar) här så kan man testa lite.

EDIT: Såg att man hade datan i figuren.
Citera
2010-02-08, 23:34
  #3
Medlem
Paste:ar hela mitt octave-script med data i för den som vill testa:

Kod:
Ri_dataset = [1200 57,
              1100 70,
              1050 80,
              1000 96,
              950 120,
              900 150,
              840 200,
              800 250,
              780 300,
              750 350,
              730 400,
              720 450,
              710 500,
              690 600,
              670 700,
              650 800,
              640 900,
              632 1000];

Ri = Ri_dataset(Begin_range:end,2);
Ti = Ri_dataset(Begin_range:end,1);

Ri_intp = 40:1:650;
Ti_intp = newtonInterpolation(Ri, Ti, Ri_intp);

#plot(Ri_intp, Ti_intp);
plot(Ri_intp, Ti_intp, 'r-', Ri, Ti, 'g-*');
axis([0 max(Ri_intp) 500 1300]);

function y = newtonInterpolation(X,Y,x)
  % interpolate values y at points x using data vectors X and Y
  n = length(X);
  % build coefficient table
  D = diag(Y);
  for m = 1:n
    for i = 1:n-m
      j = i+m;
      D(i,j) = (D(i+1,j)-D(i,j-1))/(X(j)-X(i));
    end
  end
  % return final value
  y = Y(1)*ones(size(x));
  for k = 2:n
    s = D(1,k);
    for i = 1:k-1
      s = s.*(x-X(i)*ones(size(x)));
    end
    y = y+s;
  end
end



Det jag försöker uppnå är att få en vettig mappning av temperatur kontra resistans över en bit yttriumdopad zirconiumoxid med platinaelektroder runt (bränslecell eller lambdasond till bil, samma teknik). Formen på kurvan är viktig för att kunna använda resistansvärdet för att temperaturreglera till en exakt temperatur, dels måste jag veta hurpass långt ifrån önskad temp jag är för att kunna kompensera min process i de lägen reglerloopen inte hinner med.
__________________
Senast redigerad av zilog 2010-02-08 kl. 23:36.
Citera
2010-02-08, 23:41
  #4
Medlem
evolutes avatar
Med tanke på att dina mätvärden inte är så exakta borde vanlig linjär interpolation räcka fint. Så här ser det ut för linjära/kubiska splines.

http://i47.tinypic.com/fd4pz8.png
Citera
2010-02-08, 23:46
  #5
Medlem
Citat:
Ursprungligen postat av evolute
Med tanke på att dina mätvärden inte är så exakta borde vanlig linjär interpolation räcka fint. Så här ser det ut för linjära/kubiska splines.

http://i47.tinypic.com/fd4pz8.png

Jag har redan försökt med linjär interpolation utan att nå stabilitet med vettig hastighet i min PID-loop (nu är jag lite för mycket nybörjare på PID-loopar för att vara säker på att jag gjorde rätt).

Borde ha nämnt att det är intervallet runt 300 ohm (x-axel) som jag vill hamna kring. Sedan vill jag ha linjäritet för 650-850 grader. Det svåra är att få reglerloopen att inte skicka våldsam fart precis när man passerar målvärdet, där det blir hyggligt olinjärt. Iofs kanske man kan sy ihop något som ger en mjuk gång kring 300 ohm, men kör linjär interpolering för resten.
Citera
2010-02-08, 23:50
  #6
Medlem
evolutes avatar
Jag tror knappast att interpolationen är ditt problem här. Din data är inte särskilt exakt så du kommer inte kunna vinna något på att interpolera "bättre". Det är väl snarare dina PID-värden som måste finslipas.
Citera
2010-02-08, 23:58
  #7
Medlem
Ska ge det ett nytt lite mer seriöst försök nästa gång jag ger mig på hårdvaran. Hur fungerar det nu med PID-loopar och ickelineäritet? Om derivatan inom det intressanta området ändrar sig en faktor 4, då måste förstärkningen minskas med 4 gånger jämfört med ett helt lineärt system? Jag har väldigt mycket yttre temperatursteg i systemet, så det är viktigt att det varken vänger eller blir instabilt av laststeg.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback