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

Fitten einer Kurve mittels gegebener Punkte

 

Unrealmirakulix
Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 11.11.12
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 14.02.2014, 20:19     Titel: Fitten einer Kurve mittels gegebener Punkte
  Antworten mit Zitat      
Hallo,

bisher hatte ich meine Mesdaten stets mit plot() und errorbar() dargestellt. Es wäre aber besser wenn ich aus den gegebenen Durchschnittswerten statt den direkten linearen Verbindungen eine Trendlinie wie in Excel legen könnte. Da kann man ja beispielsweise Polynom 3. Grades auswählen und schon ist es fertig.
In Matlab habe ich es nun auch versucht, nur leider wird hier nichts "rund". Ich bekomme zwar keinen Fehler, aber dereinfache Plot sieht genauso aus wie die Annäherung mit Polynomen. Ich habe auch schon am Grad des Polynoms gedreht. Hilft nichts...

Hier etwas Code einer der subplots, so sollte es übersichtlich bleiben (es sind je 5 Messpunkte pro Kurve; 4 Kurven + optional jeweils eine errorbar):

Code:
subplot(121)
    hold on
   
    % line between measure points
    if l == 0
        plot(p,nanmean(TG1S(:,:,1),2),'-ko', p,nanmean(TG1S(:,:,2),2)','-k*', p,nanmean(TG1S(:,:,3),2),'-kd', p,nanmean(TG1S(:,:,4),2),'-.ks')
    elseif l == 1
        poly1 = polyfit(p,nanmean(TG1S(:,:,1),2)',p_n);
        fit1 = polyval(poly1,p);
        plot(p,fit1,'-ko')
       
        poly2 = polyfit(p,nanmean(TG1S(:,:,2),2)',p_n);
        fit2 = polyval(poly2,p);
        plot(p,fit2,'-k*')
       
        poly3 = polyfit(p,nanmean(TG1S(:,:,3),2)',p_n);
        fit3 = polyval(poly3,p);
        plot(p,fit3,'-kd')
       
        poly4 = polyfit(p,nanmean(TG1S(:,:,4),2)',p_n);
        fit4 = polyval(poly4,p);
        plot(p,fit4,'-.ks')
    end

    % add error bars?
    if e == 1
        errorbar(p', nanmean(TG1S(:,:,1),2), nanstd(TG1S(:,:,1),1,2), '.', 'Linewidth',1)
        errorbar(p', nanmean(TG1S(:,:,2),2), nanstd(TG1S(:,:,2),1,2), '.', 'Linewidth',1)
        errorbar(p', nanmean(TG1S(:,:,3),2), nanstd(TG1S(:,:,3),1,2), '.', 'Linewidth',1)
        errorbar(p', nanmean(TG1S(:,:,4),2), nanstd(TG1S(:,:,4),1,2), '.', 'Linewidth',1)
    end
    hold off
    title(strcat({'\bf average '},g1))
    ylabel(yaxis)
    xlabel(xaxis)
    axis([min(p)-5 max(p)+5 -0.05 1.05])           % xmin xmax ymin ymax
    set(gca, 'Xtick', p);                          % only show -25:5:20 on y-axis
    grid off

    % convert values on y-axis to percent
    set(gca, 'YTickMode','manual')
    set(gca, 'YTickLabel',num2str(100.*get(gca,'YTick')','%g%%'))


Wenn irgendjemand eine Idee hat mit helft mir. Vielen Dank schon mal.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.02.2014, 21:33     Titel:
  Antworten mit Zitat      
Hallo,

das ist etwas schwierig, ohne die Daten zu kennen.

Wenn die Daten relativ weit auseinander liegen, dann sollte man das Polynom aber nicht nur an den Datenpunkten auswerten, sondern auch an Zwischenpunkten, also z.B.
Code:
pfein = linspace(min(p), max(p), 200);

fit1 = polyval(poly1,pfein);
plot(pfein,fit1,'-ko')


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Unrealmirakulix
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 11.11.12
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 14.02.2014, 23:44     Titel:
  Antworten mit Zitat      
Hallo Harald,

ok, werde ich gleich mal testen. Danke Smile

Hier ein Screenshot vom Plot ohne fitting: http://prntscr.com/2six2h

Ideal sollte dabei etwa so eine Kurve herauskommen: http://teachers.brg-schoren.ac.at/h.....ometrische_funktion_2.jpg

Viele Grüße,

Daniel

edit: Sieht schon mal wesentlich eher nach dem aus, was ich mir wünsche: http://prntscr.com/2sjft3 (jetzt auch in passenden Farben)

Vielen Dank.

PS: Eventuell hast du auch eine Idee für die Standardabweichung: Da sie bei allen Kurven recht groß ist, überlappen die errorbars total. Kann man das irgendwie anders statistisch sinnvoll und zudem sauber plotten?

PPS: ... und sigstar() muss auch noch rein. Uh, das wird noch lustig... ^^
Private Nachricht senden Benutzer-Profile anzeigen
 
Unrealmirakulix
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 11.11.12
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 15.02.2014, 03:08     Titel:
  Antworten mit Zitat      
bevor ich es vergesse: Ich müsste in dem plot noch auf der x-Achse jeweils die Punkte markieren die bei 50% (y-Achse) liegen. Am Besten mit geraden Linien zu beiden Achsen. Gibt es da etwas elegantes?

.. oder soll ich dafür lieber einen neuen Thread aufmachen?

Genug für heute, gn8...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.02.2014, 09:10     Titel:
  Antworten mit Zitat      
Hallo,

@ PS: es geht dir ja vermutlich darum, die Abweichungen im Vergleich zu einander darzustellen. Dann könnte man nanstd auch mit einem Vorfaktor, z.B. 0.1, skalieren.

Geraden lassen sich zeichnen, in dem man zwei Punkte plottet.

Horizontal zwischen x1 und x2 auf Höhe y0:
Code:
plot([x1, x2], [y0, y0], 'k:')


Vertikal zwischen y1 und y2 auf Höhe x0:
Code:
plot([x0, x0], [y1, y2], 'k:')


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Unrealmirakulix
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 11.11.12
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 15.02.2014, 14:34     Titel:
  Antworten mit Zitat      
ok, das mit der Skalierung ist natürlich möglich. Zur Vereinfachung nehme ich jetzt lieber mal meine Darstellung mit 2 Kurven pro subplot Wink

Ja genau, es geht um zwei Vorgehensweisen, die mit einander verglichen werden.

Jetzt muss ich nur noch die 50%-Werte irgendwo herbekommen...

Also einmal linear interpolieren und bei der Variante mit polyfit entsprechend dem Polynom den Wert finden...

Ich hab das jetzt mal mit fct1 und fct2 beschrieben. Hier der Code:

Code:

figure;
   
    subplot(141)
    hold on
   
    % line between measure points
    if l == 0
        plot(p,nanmean(TG1S(:,:,1),2),CSS1, p,nanmean(TG2S(:,:,1),2)',CSS2)
    elseif l == 1
        poly1 = polyfit(p,nanmean(TG1S(:,:,1),2)',p_n);
        fit1 = polyval(poly1,pfein);
        plot(pfein,fit1,CSS1)
       
        poly2 = polyfit(p,nanmean(TG2S(:,:,1),2)',p_n);
        fit2 = polyval(poly2,pfein);
        plot(pfein,fit2,CSS2)
    end
   
    % add error bars?
    if e == 1
        errorbar(p', nanmean(TG1S(:,:,1),2), nanstd(TG1S(:,:,1),1,2), css1, 'Linewidth',1)
        errorbar(p', nanmean(TG2S(:,:,1),2), nanstd(TG2S(:,:,1),1,2), css2, 'Linewidth',1)
    end
   
    % add significance star to standard plot variant
    if sig == 1 && l == 0
       
        head = [head ' - sigStar']; % edit plot name, only the 1st time to avoid ... sigStar - sigStar - ...
        sspace = 0.2;   % some more space inside the plot for sigStars
        min_p = min(p);
        max_p = max(p);
       
        if min_p == 0   % easy test data volume
            sigstar({[0,5],[5,10],[10,15],[15,20]})
        elseif min_p == -10 && max_p == 20   % full data volume
            sigstar({[-10,-5],[-5,0],[0,5],[5,10],[10,15],[15,20]})
        elseif min_p == -10 && max_p == 10  % normal test data volume
            sigstar({[-10,-5],[-5,0],[0,5],[5,10]})
        end
           
    end
   
    % mark 50% values
    if l == 0       % linear (no-approx)
        fct1 =
        fct2 =
    elseif l ==1    % poly approx
        fct1 =
        fct2 =
    end
    svs_y0 = 0;
    svs_y1 = 0.5;
    svs_x1 = fct1(0.5);
    svs_x2 = fct2(0.5);
    plot([svs_x0, svs_x2], [svs_y1, svs_y1], 'k:')  % y-aixis to x_max(A,B)
    plot([svs_x1, svs_x1], [svs_y0, svs_y1], 'k:')  % A to x-axis
    plot([svs_x2, svs_x2], [svs_y0, svs_y1], 'k:')  % B to x-axis
   
    hold off
    title('\bf male speaker (m)')
    ylabel(yaxis)
    xlabel(xaxis)
    axis([min(p)-5 max(p)+5 -0.05 1.05+sspace])           % xmin xmax ymin ymax
    set(gca, 'Xtick', p);                          % only show -25:5:20 on y-axis
    grid off

    % convert values on y-axis to percent
    set(gca, 'YTickMode','manual')
    set(gca, 'YTickLabel',num2str(100.*get(gca,'YTick')','%g%%'))
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Unrealmirakulix
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 11.11.12
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 15.02.2014, 14:42     Titel:
  Antworten mit Zitat      
die Frage zur Signifikanz habe ich in einen neuen Thread gepackt: http://www.gomatlab.de/viewtopic,p,129164.html
Private Nachricht senden Benutzer-Profile anzeigen
 
Unrealmirakulix
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 11.11.12
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 16.02.2014, 01:33     Titel:
  Antworten mit Zitat      
Hab's inzwischen schon ganz gut danke deiner Hilfe hinbekommen Smile

Code:

% mark 50% values
    svs_y0 = -0.05;
    svs_y1 = 0.5;
    svs_x0 = min(p)-5;
   
    % interpolation via invers-functions to get 50% values
    if l == 0       % linear (no-approx)
        vq1 = interp1(nanmean(TG1S(:,:,1),2),p,0.5);
        vq2 = interp1(nanmean(TG2S(:,:,1),2)',p,0.5);
        svs_x1 = min(vq1, vq2);
        svs_x2 = max(vq1, vq2);
    elseif l == 1    % poly approx
        vq1 = interp1(fit1,pfein,0.5);
        vq2 = interp1(fit2,pfein,0.5);
        svs_x1 = min(vq1, vq2);
        svs_x2 = max(vq1, vq2);
    end
   
    plot([svs_x0, svs_x2], [svs_y1, svs_y1], 'k:')  % y-aixis to x_max(A,B)
    plot([svs_x1, svs_x1], [svs_y0, svs_y1], 'k:')  % A to x-axis
    plot([svs_x2, svs_x2], [svs_y0, svs_y1], 'k:')  % B to x-axis
 


=> linear: http://prntscr.com/2sv2bl

=> poly 3. Grades: http://prntscr.com/2sv5g1
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.