WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Nichtlineares Fitting an vorgegebene Funktion

 

bene2407
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 18.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2012, 11:39     Titel: Nichtlineares Fitting an vorgegebene Funktion
  Antworten mit Zitat      
Schönen Nachmittag,

ich habe an einem Setup Werte aufgenommen, die an eine Funktion angenähert und die Parameter ausgegeben werden sollen.
Die Funktion ist von der Art:

y(t)=((exp(A*Z)-1)*exp(-A*B*t))/(1+(exp(A*Z)-1)*exp(-A*B*t)).

Wobei A und B die relevanten Parameter sind und Z eine analytisch bestimmbare Konstante(und schon bestimmt).

Wie lässt sich dieses Problem lösen?

Grüße,
Benedikt
Private Nachricht senden Benutzer-Profile anzeigen


flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2012, 12:35     Titel:
  Antworten mit Zitat      
die Diskussion läuft hier ebenso http://www.gomatlab.de/funktionspar.....ten-bestimmen-t24185.html
Private Nachricht senden Benutzer-Profile anzeigen
 
bene2407
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 18.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2012, 09:35     Titel:
  Antworten mit Zitat      
Hallo,
habe den Code von meinem Vorgänger übernommen: allerdings sieht die vorgeschlagene Kurve nicht optimal aus. Das Fehlerquadrat sinkt auch nicht weit genug ab. Als MatLab-Anfänger habe ich nur eine Ahnung woran das liegen könnte, aber ich weiss nicht wie ich was verändern muss.
Das ist die main.m:
Code:
clear;
global index;
index=1;
k1=0.1;
k2=0.1;
% initial value of the parameters
k=[k1,k2];

options=optimset('TolFun',1e-15);
[coefficence_k, deviation, exitflag] = fminsearch('calculate',k)

ts = [6.75
14.25
21.75
29.25
36.75
44.25
51.75
81.75
96.75
104.25
119.25
126.75
141.75
149.25
156.75
164.25
179.25
194.25
224.25
239.25
246.75
254.25
261.75
276.75
284.25
291.75
306.75
314.25
321.75
329.25
336.75
351.75
374.25
381.75
389.25
396.75
404.25
411.75
419.25
434.25
441.75
449.25
];

experimentdata = [0.99617
0.99568
0.99459
0.99591
0.99558
0.99558
0.99570
0.99581
0.99562
0.99526
0.99502
0.99052
0.99503
0.99493
0.99429
0.98916
0.99332
0.98942
0.96723
0.94153
0.92859
0.85379
0.78423
0.66561
0.60403
0.47951
0.28846
0.22083
0.13424
0.11811
0.08813
0.06229
0.04606
0.04674
0.03506
0.03685
0.03948
0.03943
0.02959
0.02792
0.02591
0.02429
];

figure(1)
t=1:1:600;
k1 = coefficence_k(1);
k2 = coefficence_k(2);
x = (exp(k1*32)-1)*exp((-k1)*k2*t)./(1+(exp(k1*32)-1)*exp((-k1)*k2*t));
plot(t,x,'r')
hold on

plot(ts,experimentdata,'ro')


Hier ist die calculate.m:
Code:
function deviation = calculate(k);
global index,k;

ts = [6.75
14.25
21.75
29.25
36.75
44.25
51.75
81.75
96.75
104.25
119.25
126.75
141.75
149.25
156.75
164.25
179.25
194.25
224.25
239.25
246.75
254.25
261.75
276.75
284.25
291.75
306.75
314.25
321.75
329.25
336.75
351.75
374.25
381.75
389.25
396.75
404.25
411.75
419.25
434.25
441.75
449.25
];

experimentdata = [0.99617
0.99568
0.99459
0.99591
0.99558
0.99558
0.99570
0.99581
0.99562
0.99526
0.99502
0.99052
0.99503
0.99493
0.99429
0.98916
0.99332
0.98942
0.96723
0.94153
0.92859
0.85379
0.78423
0.66561
0.60403
0.47951
0.28846
0.22083
0.13424
0.11811
0.08813
0.06229
0.04606
0.04674
0.03506
0.03685
0.03948
0.03943
0.02959
0.02792
0.02591
0.02429
];

steps = length(ts);

k1 = k(1);
k2 = k(2);

x = (exp(k1*32)-1)*exp((-k1)*k2*ts)./(1+(exp(k1*32)-1)*exp((-k1)*k2*ts));
 
sum = 0;
 for i = 1: steps
          sum = sum + abs((x(i) - experimentdata(i))/experimentdata(i));
 end
 
 sum = sum/steps;
 deviation = sum;
 
 figure(2)
 hold on
 plot(index,deviation,'r*')
 index=index+1;
 


Habt ihr eine Idee und könnt mir helfen?

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
bene2407
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 18.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2012, 11:24     Titel:
  Antworten mit Zitat      
Der Code funktioniert mittlerweile. Habe mich für nlinfit entschieden.

Um herauszufinden, ob die eingegebenen Startwerte im 95%-Konfidenzintervall liegen, schlägt MatLab die Funktion nlparci vor.

Wende ich diese Funktion an, ergibt sich folgendes Bild:
Code:
a0=[1;1];

acalc =

    2.1441
    0.0157


ci =

    1.9640    2.3242
    0.0155    0.0158

a0 sind Startwerte, acalc die berechneten Parameter und ci die Matrix die nlparci ausgegeben wird.

Liegen nun die Startwerte im 95%-Intervall? Wie kann ich an der Matrix ablesen ob die Werte in Ordnung sind oder nicht?

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.