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

f(x,y) in 3 D darstellen

 

HubiHH
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 02.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.04.2009, 13:44     Titel: f(x,y) in 3 D darstellen
  Antworten mit Zitat      
Hallo Forumsmitglieder,

ich stehe vor dem Problem eine Funktion f(x,y) als 3D Graphik zu plotten.

Es handelt sich um einen zweidimensionalen (Kerndichte-) Schätzer aus der Statistik, mithilfe dem ich eine Dichtefunktion f(x,y) darstellen möchte.

Eingangsvektor xi und yi sind die gemessenen Rohdaten, n die Stichprobengröße und h1 bzw. h2 die sog. Bandbreite, mit der die Dichtefunktion angepasst werden kann.

Ich hoffe, die folgende Darstellung der Funktion ist verständlich, bzw. vorab eigentlich die Frage: Wie stelle ich in Matlab eine mathematische Reihe bzw. Folge dar?

f(x,y)= 1/n * ((Reihe über i=1 bis n) * (1/h1) * K(u1) * (1/h2) * K(u2))

K ist dabei ein Kern, z.B. Gauss: (1/Wurzel(2*pi)) * exp((-1)*((u1 oder u2)²/2))

mit u entsprechend

u1 = (x-xi)/h1
u2 = (y-yi)/h2

Das Plotten müsste dann erfolgen über:


Code:

[X,Y] = meshgrid(0:0.5:15.5,0:260:8060);
Z = oben beschriebene Funktion
surf(X,Y,Z)
 


Freue mich sehr auf vielleicht ein paar Anregungen! Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen


derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 30.04.2009, 19:47     Titel:
  Antworten mit Zitat      
Hi,

vielleicht hilft dir, das Z eine Matrix sein sollte, mit deinen Erhebungswerten, das heißt du solltest eine Matrix f(x,y) erzeugen. Am einfachsten geht das mit 2 For-Schleifen allerdings ist das nicht so performant, besser wäre es ohne Schleifen mit Vektor und Matrixen Manipulationen.

Hilft das schon?

Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
HubiHH
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 02.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2009, 16:36     Titel:
  Antworten mit Zitat      
Hallo Forumsmitglieder,

nun habe ich noch mal einen verständlicheren und einfacheren Code angegeben, da mir bei meinem bereits gelöschten Code doch einige Fehler aufgefallen sind. Hoffentlich sind diese nun bereinigt.

Meine ganz konkrete Frage: Wie weise ich in der dritten Schleife den ermittelten Wert dem entsprechenden Ort (Z=f(x,y)) zu? In meinem code wäre das die Stelle Z=[x,C]. Irgendtewas ist daran falsch: Kann mir einer helfen? Vielen Dank!

Code:

n=75;                   %Stichprobengröße
h1=2;                   %Bandbreite h1
h2=2;                   %Bandbreite h2
j=0:31;                 %Laufvariable
A=length(j);            %Hilfsvektor
B=length(j);            %Hilfsvektor
N=length(n);            

xi=xlsread('Eingangsdaten MATLAB.xls',1,'B3:B77'); %Eingangsdaten x
yi=xlsread('Eingangsdaten MATLAB.xls',1,'C3:C77'); %Eingangsdaten y

Z=zeros(length(xi),length(yi));  %Hilfsvektor


for a=1:A                       %x-Werte
    x=a*0.5;                    %für x von 0 bis 15,5 in 31 Schritten siehe Laufvariable j
    for b=1:B                   %y-Werte
        y=b*260;                %für y von 0 bis 8060 in 31 Schritten siehe Laufvariable j
        for i=1:N               %an jeder x,y Stelle in der gesamten Stichprobe
       
            u1=((x-xi(i))./h1);         %(x-xi/h1)
            k1=(1/h1)*((1/(sqrt(2*pi)))*exp((-1)*(1/2)*(u1*u1)));
            l1=(k1*(1/n));
               
            u2=((y-yi(i))./h2);         %(y-yi/h2)
            k2=(1/h2)*((1/(sqrt(2*pi)))*exp((-1)*(1/2)*(u2*u2)));
            l2=(k2*(1/n));
               
            C=sum(l1)+sum(l2);      
       
            Z=[x,C];                    %Z-Matrix (f(x,y))
       
            clear l1;
            clear l2;
        end
    end
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Lucia
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 55
Anmeldedatum: 19.03.09
Wohnort: ---
Version: R2008b
     Beitrag Verfasst am: 04.05.2009, 17:10     Titel:
  Antworten mit Zitat      
Hi,
da sind mir ein paar Dinge nicht so klar. Dieses j wird nie verwendet, also wieso nicht gleich:
Code:
A=32; B=32;
(A und B sind auch keine Vektoren im angegebenen Code). Dann weist
Code:
N den Wert 1 zu, ist hier nicht eher einfach
Code:

In der innersten Schleife stimmt auch was nicht. l1 und l2 sind so keine Vektoren, sondern nur Zahlwerte (für das jeweilige i). Also entweder die innerste Schleife vektorisieren und weglassen -- also xi statt xi(i) etc. (besser), oder sowas wie
Code:
C= C+l1+l2
verwenden.
Die Zuweisung an Z sollte vermutlich so aussehen:
Code:
Das dann aber nach der innersten Schleife, oder? Ich hoffe, das ist alles halbwegs verständlich...
Viele Grüße, Lucia
Private Nachricht senden Benutzer-Profile anzeigen
 
HubiHH
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 02.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2009, 18:30     Titel:
  Antworten mit Zitat      
Hallo Lucia,

super, vielen Dank! Bei der Einarbeitung Deiner Vorschläge, sind mir noch ein paar weitere Fehler aufgefallen - das kommt wahrscheinlich davon, wenn man laufend Veränderungen macht, bzw. neue Ansätze testet. Anbei der funktionierende Code:

Code:

n=75;                   %Stichprobengröße
h1=2;                   %Bandbreite h1
h2=5;                   %Bandbreite h2
A=32;                   %Hilfsvektor
B=125;                  %Hilfsvektor
C=0;

xi=xlsread('Eingangsdaten MATLAB.xls',1,'B3:B77'); %Eingangsdaten x
yi=xlsread('Eingangsdaten MATLAB.xls',1,'C3:C77'); %Eingangsdaten y

Z=zeros(32,125);  %Zielmatrix


for a=1:A                       %x-Werte
    x=a*0.5;                    %für x von 0 bis 15,5 in 31 Schritten siehe Laufvariable j
    for b=1:B                   %y-Werte
        y=b*65;                %für y von 0 bis 8060 in 31 Schritten siehe Laufvariable j
        for i=1:n               %an jeder x,y Stelle in der gesamten Stichprobe
       
            u1=((x-xi(i))./h1);         %(x-xi/h1)
            k1=(1/h1)*((1/(sqrt(2*pi)))*exp((-1)*(1/2)*(u1*u1)));
                           
            u2=((y-yi(i))./h2);         %(y-yi/h2)
            k2=(1/h2)*((1/(sqrt(2*pi)))*exp((-1)*(1/2)*(u2*u2)));
           
            k=k1*k2;
           
            C=C+k;
                                 
        end
        C=(1/n)*C;
        Z(a,b)=C;                         %Z-Matrix (f(x,y))
    end
end
 


Viele Grüße, HubiHH
Private Nachricht senden Benutzer-Profile anzeigen
 
HubiHH
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 02.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2009, 11:36     Titel:
  Antworten mit Zitat      
Ein Problem tut sich doch noch auf:

Mit dem Code einen Beitrag höher erzeuge ich eine 32x125 Matrix Z.

Mit folgendem Code erzeuge ich die Koordinatenmatrizen.

Code:

[X,Y]=meshgrid(0:0.5:15.5,0:65:8060);
 


Allerdings habe ich dann X=(125,32) und Y=(125,32). Müssten die nicht X=(32,125) und Y=(32,125) sein? Da mein x-Vektor die Länge 32 hat und mein Y-Vektor 125?

Ich werde das Gefühl nicht los, dass sich hier ein Fehler eingeschlichen hat, auch kann ich aus dem Bild leider noch nicht ganz genau erkennen, ob es sich um einen Fehler handelt?

Kann mir einer zur Seite springen? Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Maddy
Ehrenmitglied

Ehrenmitglied



Beiträge: 494
Anmeldedatum: 02.10.08
Wohnort: Greifswald
Version: ---
     Beitrag Verfasst am: 05.05.2009, 11:57     Titel:
  Antworten mit Zitat      
Da der erste Eintrag bei der Indizierung die Zeilen (also y-Richtung) und der zweite die Spalten (also x-Ricthugn) bezeichnet, müsste die Zuweisung in der Schleife wahrscheinlich

Code:


heißen.
_________________

>> why
The computer did it.
Private Nachricht senden Benutzer-Profile anzeigen
 
HubiHH
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 02.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2009, 12:02     Titel:
  Antworten mit Zitat      
Danke, aber das erzeugt dann eine 125x125 Matrix Z.
Private Nachricht senden Benutzer-Profile anzeigen
 
Maddy
Ehrenmitglied

Ehrenmitglied



Beiträge: 494
Anmeldedatum: 02.10.08
Wohnort: Greifswald
Version: ---
     Beitrag Verfasst am: 05.05.2009, 12:34     Titel:
  Antworten mit Zitat      
Du musst halt die Vor-Definition im oberen Bereich auch umkehren. Wink

In etwa so:

Code:
Z=zeros(125,32);  %Zielmatrix
 


Anmerkung: vll baust du am Anfang des Skripts zusätzlich ein clear all (Löschen aller Variablen) ein um Überschneidungen beim mehrfachen ausführen zu vermeiden.
_________________

>> why
The computer did it.
Private Nachricht senden Benutzer-Profile anzeigen
 
HubiHH
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 02.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2009, 14:13     Titel:
  Antworten mit Zitat      
Jau, cool! Danke!
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.