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

Approximation mit genau drei Geradenstücken

 

GetBack
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 19.11.08
Wohnort: Cottbus
Version: ---
     Beitrag Verfasst am: 05.03.2009, 00:02     Titel: Approximation mit genau drei Geradenstücken
  Antworten mit Zitat      
Hallo ,

ich habe folgendes Problem und hoffe das ihr mir dabei weiterhelfen könnt:

Ich habe 16 Datenreihen mit je zwanzig Werten die mir als Array vorliegen. Diese Daten stellen Messergebnisse von Bakterienkonzentrationen dar. Meine Aufgabe ist es nun zwei bestimmte Punkte über eine Approximation zu ermitteln. Dazu soll ich (laut meinem Professor) eine Polygonzug-Approximation mit drei Geradenstücken machen. Der Startpunkt und der Endpunkt sind dabei jeweils durch das erste bzw. letzte Datenpaar der jeweiligen Datenreihe festgelegt. Nur die zwei zu bestimmenden Punkte als Verbindungspunkte der Geradenstücke sind natürlich frei.

Ich habe schon eine Weile im Internet recherchiert, aber bis jetzt nicht viel dazu gefunden.

Nun zu meiner Frage: Wie kann ich diese Art der Approximation in Matlab umsetzen und mit welchen Funktionen?

Vielen Dank im Voraus
GetBack
Private Nachricht senden Benutzer-Profile anzeigen


steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 05.03.2009, 10:19     Titel:
  Antworten mit Zitat      
Moin,

kannst du mal ein Beispiel geben, wie das ganze aussehen soll? Bild oder Code?

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
GetBack
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 19.11.08
Wohnort: Cottbus
Version: ---
     Beitrag Verfasst am: 05.03.2009, 13:39     Titel:
  Antworten mit Zitat      
Hallo,

im Anhang habe ich mal schnell das ganze dargestellt. Die roten Punkte sind die gegebenen Datenpaare aus einem Datensatz. Die zwei zu ermittelnden Punkte (als Verbindungspunkte der Geradenstücke) habe ich dort auch dargestellt.
Könnt ihr damit was anfangen?

Viel grüße
GetBack

antibiotika.gif
 Beschreibung:
Beispiel für das Auffinden der gesuchten zwei Konzentrationspunkte

Download
 Dateiname:  antibiotika.gif
 Dateigröße:  4.19 KB
 Heruntergeladen:  519 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 05.03.2009, 22:52     Titel:
  Antworten mit Zitat      
Hallo GetBack,

für eine einzelne lineare Approximation brauchst du

Code:


Ansonsten würde ich wahrscheinlich in einem ersten hau-Ruck-Ansatz alle 153 Möglichkeiten ausprobieren und diejenige mit dem kleinsten Fehler auswählen. Dafür braucht man keine speziellen Funktionen, nur eine for-Schleife. Hattest Du auch an so etwas gedacht, oder sollte es etwas akademischer sein? Bereitet Dir die Schleife schon Probleme?

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Idefix_1024
Forum-Century

Forum-Century


Beiträge: 230
Anmeldedatum: 16.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2009, 10:38     Titel:
  Antworten mit Zitat      
also sowas in der Art hier

Code:

Bakterienzahl   = [100 101 107 100 102 103 20 24 23 21 20];
Antibiotikakonz = [0 1 10 11 16 20 25 30 31 32 33];

delta   = 0.05;
neues_x = min(Antibiotikakonz):delta:max(Antibiotikakonz);
n       = length(neues_x);
neue_Werte1 = zeros(n,1);
neue_Werte2 = zeros(n,1);
neue_Werte3 = zeros(n,1);
for i=1:1:n
    neue_Werte1(i,1) = interp1(Antibiotikakonz,Bakterienzahl,neues_x(i),'nearest');
    neue_Werte2(i,1) = interp1(Antibiotikakonz,Bakterienzahl,neues_x(i),'linear');
    neue_Werte3(i,1) = interp1(Antibiotikakonz,Bakterienzahl,neues_x(i),'cubic');
end;

figure
hold on
plot(Antibiotikakonz,Bakterienzahl,'rx','MarkerSize',10,'LineWidth',2)
plot(neues_x,neue_Werte1,'m')
plot(neues_x,neue_Werte2,'c')
plot(neues_x,neue_Werte3,'b')
legend('original','nearest','linear','cubic')
hold off
 


hilft das was?
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 06.03.2009, 12:26     Titel:
  Antworten mit Zitat      
Hallo,

vielleicht eher so?

Code:
Bakterienzahl   = [100 101 107 100 102 103 64 22 24 23 21 20];
Antibiotikakonz = [0 1 10 11 16 20 22 25 30 31 32 33];

Anzahl = length(Bakterienzahl);
Verbindungspunkte = nchoosek(2:Anzahl-1,2);

for ind = 1:size(Verbindungspunkte,1)
    VP1 = Verbindungspunkte(ind,1);
    VP2 = Verbindungspunkte(ind,2);
   
    BZ1 = Bakterienzahl(1:VP1);
    BZ2 = Bakterienzahl(VP1:VP2);
    BZ3 = Bakterienzahl(VP2:end);
    AK1{ind} = Antibiotikakonz(1:VP1);
    AK2{ind} = Antibiotikakonz(VP1:VP2);
    AK3{ind} = Antibiotikakonz(VP2:end);
   
    A1 = [AK1{ind}(1) 1;AK1{ind}(end) 1]; b1 = [BZ1(1);BZ1(end)];
    p1 = A1\b1;
    BZ1_interp{ind} = polyval(p1,AK1{ind});
    A2 = [AK2{ind}(1) 1;AK2{ind}(end) 1]; b2 = [BZ2(1);BZ2(end)];
    p2 = A2\b2;
    BZ2_interp{ind} = polyval(p2,AK2{ind});
    A3 = [AK3{ind}(1) 1;AK3{ind}(end) 1]; b3 = [BZ3(1);BZ3(end)];
    p3 = A3\b3;
    BZ3_interp{ind} = polyval(p3,AK3{ind});
   
    F(ind) = sum([(BZ1_interp{ind}-BZ1).^2,...
                  (BZ2_interp{ind}-BZ2).^2,...
                  (BZ3_interp{ind}-BZ3).^2]);  
end

best_ind = find(F==min(F));

figure
hold on
plot(Antibiotikakonz,Bakterienzahl,'rx')
plot(AK1{best_ind},BZ1_interp{best_ind},'b',...
     AK2{best_ind},BZ2_interp{best_ind},'b',...
     AK3{best_ind},BZ3_interp{best_ind},'b')
legend('original','interp')
hold off


polyfit war der falsche Ansatz, da die Geraden ja durch die Verbindungspunkte gehen müssen. Der Code ist jetzt für eine Dateneihe. Für die 16 müsstest Du den Code noch anpassen. Außerdem ist der Code noch ineffizient, ist nur ein erster Ansatz.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
GetBack
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 19.11.08
Wohnort: Cottbus
Version: ---
     Beitrag Verfasst am: 06.03.2009, 12:53     Titel: Danke für die Ansätze
  Antworten mit Zitat      
Hallo,

vielen lieben Dank für die Ansätze.
Ich werde mich am Wochenende dran setzen und das mal probieren. Ich bin nämlich gerade auf Arbeit und es deswegen nicht von hieraus machen.

Ein Problem sehe ich noch: Die Verbindungspunkte müssen nicht unbedingt mit den Wertepaaren übereinstimmen, sondern sie können auch vollkommen frei sein (wenn ich mich richtig erinnere). Ich den meisten Fällen sollen sie es aber machen. Aber ich werde mich auch zuerst einmal mit dem einfacheren Fall beschäftigen.

Sobald ich was, habe melde ich mich wieder.

Viele Grüße
GetBack
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 - 2024 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.