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

nxn Matrix von einem Laufparameter abhängig --> 3 D Matr

 

TAMTAM

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2012, 16:57     Titel: nxn Matrix von einem Laufparameter abhängig --> 3 D Matr
  Antworten mit Zitat      
Hallo zusammen,

leider habe ich im Forum auf die Frage keine Anwort gefunden.
Also mein Problem:
Um später einen Graphen zu plotten, möchte ich, dass meine Matrix für verschiedene Parameter berechnet wird. Leider bekomme ich nur nullen raus:(. In einem einfachen Beispiel hat es bei mir funktioniert, jedoch in meinem richtigen Modell jetzt nicht mehr. Ich schicke die Matrix nach der Berechnung in einen while Schleife und bin mir nicht sicher ob da der Fehler liegt.
Hier mein Code zum besseren Verständnis:
Code:
     
for x = [1:10:110]; % dies ist meine Laufparameter
for i=1:n;
    for j=1:n;
        B(i,j,x)=KK(L, (x-1)/100, i-1, j-1, s, n); % meine Matrix B ist abhängig von den Zeilen und Spalten UND von dem Laufparameter
         end;
end;

Hier kommt die Schleife, in der ein Vektor immer wieder mit der Matrix B(x) multipliziert wird -- Ergebniss sollte ein Vektor sein (bzw. die Summe eines Vektors) für jedes x (ich bekomme nur nullen)

VIELEN DANK! Hoffe ich drücke mich verständlich aus.


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.07.2012, 21:39     Titel: Re: nxn Matrix von einem Laufparameter abhängig --> 3 D
  Antworten mit Zitat      
Hallo TAMTAM,
Zitat:
Ich schicke die Matrix nach der Berechnung in einen while Schleife und bin mir nicht sicher ob da der Fehler liegt.

Du hast keine WHILE-SChleife im geposteten Code.
Der Code hat mehr FORs als ENDs.
B ist keine "Matrix", sondern ein 3D-Array. Matrizen sind laut Definition 2D-Arrays.
Was ist "KK" in deinem Code? Was bedeutet: "meine Matrix B ist abhängig von den Zeilen und Spalten UND von dem Laufparameter"? Welche Zeilen, welche Spalten, welcher Laufparameter?
Welcher Vektor wird mit "der Matrix B(x)" multipliziert und was genau ist "B(x)"?
Soll das Ergebnis nun ein Vektor sein, oder "die Summe eines Vektors", also ein Skalar?
Welche Variable enthält wonach nur Nullen?

Ich verstehe also die Frage noch nicht. Bitte erkläre nochmal die notwendigen Details.

Gruß, Jan

Zuletzt bearbeitet von Jan S am 22.07.2012, 18:03, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
TAMTAM

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2012, 00:36     Titel:
  Antworten mit Zitat      
Hallo Jan,

also ich wollte es so kurz wie möglich halten deswegen habe ich die While Schleife nicht mitgeschickt. Hinter der Funktion KK versteckt sich eine Poissonverteilung (kann ich gerne auch noch mitschicken?)
Ich habe jetzt nochmal mit einer Matrix und keiner 3 D Array gerechnet (bin mir da aber nicht sicher)
Also hier der Code:
Code:

n = 100;
Lambda=130;
xalt = zeros(1,n);
xalt(1) = 1;
xneu=zeros(1,n);
s=130;
B=sparse(n:n);
k=1:n;

for x = [0:.5:1];
for i=1:n;
      for j=1:n;
        B(i,j)=KK(Lambda, x, i-1, j-1, s, n);
        end;
    end;
d=xneu-xalt;
rounds = 0;
while norm(d) > 1e-6;
    xneu = xalt*B;
    d=xneu-xalt;
    xalt = xneu;
    rounds = rounds +1;
    end;
xneu = xneu;
xneua = xneu.*(k-1);
Y = sum(xneua)
end;


D.h. mein Ziel ist es für Y 3 Werte zu bekommen für x = 0, 0.5 und 1. Ich bekomme auch 3 Werte, die alle gleich null sind. Eigentlich bräuchte ich somit 3 mal die Matrize A2(i,j) und dann müsste jede dieser in die Schleife geschickt werden.
Ich habe schon viel ausprobiert, aber komme leider nicht weiter. Wäre super, wenn du nochmal drüberschaust:) VIELEN DANK!
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.07.2012, 18:12     Titel:
  Antworten mit Zitat      
Hallo TAMTAM,

Die Standard-Methode um solche Probleme zu untersuchen ist der Debugger: Setze einen Breakpoint in die erste Zeile und gehe dann Zeile für Zeile durch den Code. Beobachte dabei die Werte der Variablen, entweder im Workspace-Browser, oder im CommandWindow.

Zwei Zeilen sind merkwürdig:
Code:
xneu = xneu;
...
Y = sum(xneua)

Die obere Zeile bewirkt nichts.
Die untere überschreibt die Y-Werte aus den vorherigen Iterationen. Ist das gewünscht?

Zitat:
Eigentlich bräuchte ich somit 3 mal die Matrize A2(i,j) und dann müsste jede dieser in die Schleife geschickt werden.

A2 taucht in DeinemCode gar nicht auf und was bedeutet "in die Schleife schicken"? Mir wird das Problem immer noch nicht klarer.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
TAMTAm

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2012, 19:30     Titel:
  Antworten mit Zitat      
Hallo Jan,

sorry ich meinte nicht A2 (i,j), sondern B(i,j).
Also der Punkt ist ich muss einen stationären Zustand berechnen, dieser stationäre Zustand tritt ein sobald die Differenz zwischen xneu und xalt kleiner als "while norm(d) > 1e-6" ist. Das Ergebnis ist ein xneu Vektor, der mir die Wahrscheinlichkeiten in jedem Zustand (k=0,1,2,3,...) angibt (stationärer Zustand). Nun möchte ich diesen Vektor nicht einzelnd für jedes x berechnen, sondern parallel für verschiedene x's damit ich dann schöne Graphen bekomme.

Vielleicht geht das auch gar nicht?
LG
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.07.2012, 21:46     Titel:
  Antworten mit Zitat      
Hallo TAMTAM,

Bringt diese Erklärung Dich der Lsöung Deines Problems näher? Eigentlich ging es darum, dass ein bestimmter Wert, so weit ich verstanden habe "Y", entgegen Deinen Erwartungen Null ist. Y ist in Deinem Code sie Summe über "xneu.*(k-1)". Verstehe ich Dich richtig, dass dies exakt 0 ergibt? Aus numerischer Sicht wäre das schon ziemlich unwahrscheinlich. Und welchen Wert erwartest Du statt dessen?

Ich habe nach wie vor nicht verstanden, wo genau Dein Problem liegt.
Code-Zeilen wie "xneu = xneu;" und "B=sparse(n:n);" tragen zu meiner Verwirrung bei.
Zitat:
Nun möchte ich diesen Vektor nicht einzelnd für jedes x berechnen, sondern parallel für verschiedene x's damit ich dann schöne Graphen bekomme.
Hat dieser Satz noch etwas mit dem Orginal-Problem zu tun, oder geht es hier schon um etwas anderes? Mit der Schleife über x gab es doch eigentlich keine Probleme, oder? Und wenn doch, hast Du sie noch nicht erklärt, oder doch? Und was sind "schöne Graphen"?

Bisher kommt ich Deinem Problem nicht näher. Ich empfehle in solchen Situationen den unüberschaubaren Problemberg in handhabbare Stücke aufzuteilen und diese dann eins nach dem anderen zu lösen. Bevor Du Code im Forum postest, lohnt es sich, ihn Zeile für Zeile anzuschauen, zu testen und Ungereimtheiten zu beseitigen. Und dann schildere Dein Problem so exakt wie möglich.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.07.2012, 21:48     Titel:
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Hallo TAMTAM,

Bringt diese Erklärung Dich der Lsöung Deines Problems näher? Eigentlich ging es darum, dass ein bestimmter Wert, so weit ich verstanden habe "Y", entgegen Deinen Erwartungen Null ist. Y ist in Deinem Code sie Summe über "xneu.*(k-1)". Verstehe ich Dich richtig, dass dies exakt 0 ergibt? Aus numerischer Sicht wäre das schon ziemlich unwahrscheinlich. Und welchen Wert erwartest Du statt dessen? Und wie testest Du, ob der Wert 0 ist?

Ich habe nach wie vor nicht verstanden, wo genau Dein Problem liegt.
Code-Zeilen wie "xneu = xneu;" und "B=sparse(n:n);" tragen zu meiner Verwirrung bei.
Zitat:
Nun möchte ich diesen Vektor nicht einzelnd für jedes x berechnen, sondern parallel für verschiedene x's damit ich dann schöne Graphen bekomme.
Hat dieser Satz noch etwas mit dem Orginal-Problem zu tun, oder geht es hier schon um etwas anderes? Mit der Schleife über x gab es doch eigentlich keine Probleme, oder? Und wenn doch, hast Du sie noch nicht erklärt, oder doch? Und was sind "schöne Graphen"?

Bisher kommt ich Deinem Problem nicht näher. Ich empfehle in solchen Situationen den unüberschaubaren Problemberg in handhabbare Stücke aufzuteilen und diese dann eins nach dem anderen zu lösen. Bevor Du Code im Forum postest, lohnt es sich, ihn Zeile für Zeile anzuschauen, zu testen und Ungereimtheiten zu beseitigen. Und dann schildere Dein Problem so exakt wie möglich.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
TAMTAM

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2012, 22:09     Titel:
  Antworten mit Zitat      
Hallo Jan,

ich gebe dir vollkommen recht, aber ich habe schon vieles ausprobiert und weiß gerade einfach nicht wie matlab tickt.
Erst zu deinen Fragen, xneu= xneu habe ich geschrieben, weil nach der 1. Iteration der xalt Vektor gleich dem xneu Vektor gesetzt wird, dann mit B2 multipliziert wird, daraus entsteht wieder ein xneu Vektor etc....
B2= sparse(n,n): Damit wollte ich einfach angeben, dass Matlab somit schneller rechnet.
Ja du hast Recht, es muss Y für x=0, für x=0,5 und für x=1 geben, für x=0 erwarte ich 0, für x=0,5 irgendwas über 0 und x=1 dann etwas über 400 (abhängig von den Parametern) ABER das Y muss mit steigendem x auch steigen.
Da das Y von xneu und xneua beeinflusst ist.
Es soll mir einfach 3 verschiedene Y´s für meine 3 verschiedene x´s ausspucken...ach wäre es schön, wenn man mit matlab reden könnte;).
LG
und danke für die nerven
 
Arjumand
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 29.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.12.2014, 08:43     Titel:
  Antworten mit Zitat      
hello,
da ich in diesem Beispiel die Periode von 1 s auf 0.1 s heruntergesetzt habe, stimmt natürlich die ausgegebene Zeitachse im Plot nicht mehr. Sicher gibt es da noch einen anderen Weg selbige zu generieren. Auch das Vorgeben meines willkürlich gewählten Abbruchkriteriums von n=1000 möchte ich so nicht habe. Der Plot soll einfach immer weiter laufen, bis ich ihn selbst beende.

Ein zweites Problem ist jetzt noch, dass ich beim weiteren Verkürzen der Timer-Periode auf 0.01 s kein figure mehr sehen kann. Es erscheint erst nach Durchlaufen der Messaufgaben. Kann ich das ändern?
Code:
[code][code][code][code][/code][/code][/code][/code]

_________________

Arjumand
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.