Matlab: Lineares Gleichungssystem lösen

Neue Frage »

mattti Auf diesen Beitrag antworten »
Matlab: Lineares Gleichungssystem lösen
Meine Frage:
Hallo, ich beschäftige mich gerade mit Matlab und komme leider nicht weiter. Im Prinzip will ich ein lineares Gleichungssystem lösen.
Gegeben ist eine Rekursion:

B(t,r)= 1/6*(1+B(t,0)+B(t,r+1)+B(t,r+2)+B(t,r+3)+B(t,r+4)+B(t,r+5))
und B(t,r)=1 falls r>=t

Das Ziel ist es jetzt B(t,0),B(t,1) explizit zu berechnen.

Meine Ideen:
Ich habe mir überlegt das erstmal für den Fall t=2 zu probieren.
Dazu habe ich mir eine Matrixgleichung der Form Ax=b überlegt.
Es hat folgende Form:
A=(
1 ,B(2,0) ,B(2,1) ,B(2,2) ,B(2,3) ,B(2,4) ,B(2,5);
1 ,B(2,0) ,B(2,2) ,B(2,3) ,B(2,4) ,B(2,5) ,B(2,6);
1 , 1 , 1 , 1 , 1 , 1 , 1 ;
1 , 1 , 1 , 1 , 1 , 1 , 1 ;
1 , 1 , 1 , 1 , 1 , 1 , 1 ;
1 , 1 , 1 , 1 , 1 , 1 , 1 ;
1 , 1 , 1 , 1 , 1 , 1 , 1 ;
)
und x= [1/6;1/6;...;1/6] ein Spaltenvektor der Länge 2+5=7.
Meine rechte Seite ist
b=[B(2,0);B(2,1);B(2,2);B(2,3);B(2,4);B(2,5);B(2,6)]

Das Ziel ist es also den Vektor b zu bestimmen.
Ich möchte das so nicht explizit eintippen, weil ich ja später die Möglichkeit haben will den Wert für t zu variieren.

ich habe mir folgendes überlegt:
for r=1:t+5
y=ones(1,t+5);
x=1/6 *y
A= zeros(t+5)
for j=1:t+5 & j=1:t+5;
if j==1
A(i,j)=A(i,j)+1
elseif i>t
A(i,j)=A(i,j)+1
elseif j==2
A(i,j)=B(t,0)
else
A(i,j)=B(t,r+

end
end


grrrrr....also irgendwie wird das nichts...
Es wäre toll wenn mir jemand helfen könnte...

Viele Grüße
Airblader Auf diesen Beitrag antworten »

Erstmal bitte einen syntaktisch korrekten Code posten -- und zwar in den entsprechenden Code-Umgebungen und vernünftig formatiert.

Dass dein Code überhaupt ohne Fehlermeldung läuft halte ich jedoch für schlicht unmöglich. Da ist von einem 'i' die Rede, das nie deklariert wird, und wie eine Zeile sinnvollerweise auf "B(t,r+" enden soll ist auch irgendwie ein Rätsel.

air
 
 
mattti Auf diesen Beitrag antworten »

Es tut mir leid, dass ich es nicht schaffe einen funktionierenden Code zu schreiben, deshalb habe ich ja um Hilfe gebeten.
Der von mir geschriebene Code ist nur ein Gedankenansatz, der an der Stelle B(t,r+ einfach nicht weiter kommt.
Ich habe diesen Code natürlich auch nicht zum laufen bekommen...
Airblader Auf diesen Beitrag antworten »

Edit: Da sich der Fragesteller nicht mehr zu Wort meldet, habe ich jegliche Hilfestellung hier bis auf Weiteres entfernt.

air
Airblader Auf diesen Beitrag antworten »

Scheinbar mal wieder in gleich zwei Threads völlig umsonst die Mühe gemacht, zu helfen. Bei der Rate, die bei programmier-bezogenen Threads zumindest gefühlsmäßig besteht, ist es echt kein Wunder, dass einem die Lust daran vergeht. unglücklich
mattti Auf diesen Beitrag antworten »

Also ich wusste nicht, dass ich gezwungen bin mich augenblicklich mit den Antworten zu beschäftigen und alles direkt zu verstehen, weil mir sonst jegliche Hilfe wieder weggenommen wird....

Sehr schade!
Airblader Auf diesen Beitrag antworten »

Bist du auch nicht, aber ich warte hier auf eine Rückmeldung. Ein "Ich schau mir das mal an" würde der Kommunikation dienen -- und inzwischen sind immerhin zwei Tage vergangen. Dazu kommt die Tatsache, dass du zuvor nichtmal auf meinen Hinweis hin deine Frage vernünftig formatiert hast.

Da du dich jetzt wieder gemeldet hast, stelle ich den wesentlichen Teil der Antwort wieder ein und bitte letztmalig darum, deine Beiträge lesbar zu verfassen und die Kommunikation insofern aufrechtzuerhalten, dass ich hier nicht "im Regen stehe".

Zitat:
Wir wissen doch, dass für gilt. Außerdem sehen wir, dass eine besondere Rolle einnimmt, da dieser in 'r' konstante Ausdruck in der Rekursion vorkommt. Es ist also naheliegend, sich erstmal und anzuschauen. Mit einer etwas langweiligen Rechnerei (bitte nachprüfen!) kommt man auf



und



für .

Ist nun , so können wir setzen:



Wir müssen berechnen, um eine simple rekursive Funktion schreiben zu können. Dazu ist der Schlüssel, da die Funktion für diese Argumente sonst unendlich oft aufgerufen wird. Zumindest für haben wir also nun schonmal folgenden Pseudocode:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function bRec(t, r) {
   if (r >= t) {
      return 1;
   }
   elseif (r == 0 && t <= 6) {
      return (6^t)/(6^t - 7^(t-1));
   }

   return 1/6 * (1 + bRec(t, 0) + bRec(t, r+1) + bRec(t, r+2) + bRec(t, r+3) + bRec(t, r+4) + bRec(t, r+5));
}


Nun fehlt noch ... aber für den Anfang sollte das genug zu lesen sein.

Das Ganze habe ich mehr oder weniger durch Rumgerechne und Trial&Error gemacht. Möglicherweise gibt's einfachere und elegantere Wege. Vielleicht habe ich irgendwo auch einen Fehler gemacht, du solltest also lieber nachrechnen.

Edit: Wenn ich's gerade richtig überblicke und das Bisherige auch tatsächlich stimmt, dann lässt sich das Ganze leicht auf verallgemeinern (einfach stupide weiterrechnen) und alles, was man tun muss, ist eine geometrische Summe berechnen.


air
mattti Auf diesen Beitrag antworten »

hy air,
erstmal danke für deine Hilfe.
Ich habe gerade versucht deine ersten beiden Gleichungen nachzuvollziehen.
Hast du bei der Zweiten einfach Werte für \ betrachtest.
Theoretisch müsste die Gleichung ja allgemein für gelten.
Kannst du mir bitte auch erklären wozu du überhaupt umgeformt hast?
das benutzt du doch dann gar nicht mehr, oder?
mattti Auf diesen Beitrag antworten »

uuuppps
bei "undefined control sequence" soll stehen :


.
Airblader Auf diesen Beitrag antworten »

Ich betrachte es nur für , weil nur für diese Werte in der Rekursionsgleichung diese Summe entsteht. Schauen wir uns einfach mal an:



Der Grund hierfür ist, dass für in der Rekursionsgleichung nur noch eine "abgeschnittene" geometrische Summe steht, die es nun eben zu berechnen gilt. Wenn man diese Rechnungen selbst durchführt und dann hinschaut, sieht man, dass man im Wesentlichen



zu berechnen hat (sieht schlimmer aus als es ist, es sind ja nur fünf Summanden!), wenn man haben will. Mit bekannten Standardtricks sollte das kein Problem sein. Dann bekommt man nämlich



Du hast übrigens korrekt bemerkt, dass die eine Umformung völlig unnötig war. Ich hatte erst anders angefangen und dabei schon geschrieben. Wie gesagt: Trial & Error. Augenzwinkern
Woher kommt die Aufgabe eigentlich? Ist sie ausschließlich dafür konzipiert, mit Matlab gelöst zu werden? Wir gehen dem Ganzen im Moment weitestgehend ja doch händisch auf die Spur. Sofern das denn auch alles stimmt (ich finde keinen Fehler, nur mein Bauchgefühl meldet sich angesichts der Zahlen...), wird eine Implementierung halt danach super-einfach. Möglicherweise lässt sich das Ganze ja aber auch von Anfang an numerisch lösen (nur mit einem stupiden rekursive-Funktion-Ansatz geht es eben leider nicht). Wie gesagt, keine Gewähr -- du solltest alles, was ich dir sage, wirklich genau anschauen und dir überlegen, ob du es überhaupt so lösen willst/sollst. Augenzwinkern

air
mattti Auf diesen Beitrag antworten »

Wow, danke!
naja, ich habe ein gewisses Matlab-Defizit und ich bin im Internet auf diese Formel gestoßen, sie beschreibt ein Würfelspiel.
Da stand halt, dass man das mit ner Matrixgleichung lösen kann und da dacht ich Matrix=Matlab-das wär doch ne gute Übung.
Ich werde alles nochmal nachrechnen und mich dann nochmal melden.

Gute Nacht
Airblader Auf diesen Beitrag antworten »

Dann dachten die offenbar an eine andere Lösung. Zum Matlab üben ist der Weg, den ich eingeschlagen habe, sicher nicht geeignet.

Ich glaube übrigens, dass deine ursprüngliche Matrix nicht stimmt. Sollte die zweite Spalte nicht durchgehend aus B(2, 0) bestehen?

Was beschreibt die Rekursion denn? Sollten meine Ergebnisse unsinnige Zahlen ergeben, wüsste ich schonmal, dass irgendwo ein Fehler ist. Augenzwinkern

air
Airblader Auf diesen Beitrag antworten »

Ich gebe einfach mal zwei Beispiele, dann kannst du mir ja sagen, ob diese Zahlen sinnvoll sind:

und

und

und

air
mattti Auf diesen Beitrag antworten »

Hy air,
also ich hab mal deine Rekursion für i=t=50 ausgerechnet und habe etwas negatives rausbekommen, was nicht sein kann.
Dann habe ich ein bischen rumprobiert und herausbekommen, dass ich für jedes t eine Matrixgleichung aufstellen kann.
für t=1 und
erhält man folgende Gleichungen:

(wie du schon ausgerechnet hattest)

Es ergibt sich als Matrixgleichung der Form Ax=b:




Macht man das für t=3, so sind x und b abgesehen von der dimension äqivalent zu bilden.
Für A ergibt sich :

Also kann man eine allgemeine Bildungsvorschrift entwerfen.
Ich habe mich mal an matlab versucht, aber es funktioniert nicht:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function [Matrix] =A(t)

Matrix=zeros(t+5)

Matrix(1,1)=Matrix(1,1)+5/6;

Matrix(1,2:6)=Matrix(1,2:6)-1/6;
for i=2:t+5 
if i < t+1
Matrix(i,i)= Matrix(i,i)+1;
Matrix(i,1)= Matrix(i,1)-1/6;
Matrix(i,i+1:i+5)=Matrix(i,i+1:i+5)-1/6;
else
Matrix(i,i+1)=Matrix(i,i+1)+1/6;
end
i=i+1;
end


So, ich hoffe die Formatierung funktioniert.
Also das Programm sollte eigentlich so funktionieren, dass ich ihm eine Zahl t übergebe und er mir dann s´die zugehörige Matrix ausgibt.


LATEX CODE korrigiert, bitte zukünftig die Vorschaufunktion verwenden
mattti Auf diesen Beitrag antworten »

Danke für deine Korrektur,
ich hab das Programm jetzt hinbekommen smile
Danke auch für deine Hilfestellungen!
Airblader Auf diesen Beitrag antworten »

Hi,

kannst du das Programm (und vielleicht den Link zur Problemstellung) vielleicht noch einstellen? Wäre für mich auch interessant, das nochmal anzuschauen.

Wo bei mir der Fehler ist (negativ wirds übrigens ab t=15) schaue ich, falls ich die Zeit finde, auch nochmal. Aber schön, dass du es hinbekommen hast. Freude

air
mattti Auf diesen Beitrag antworten »

Hi air,
Hier ist das Programm :
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
function [C] = MatrixRec(t)
%berechnet eine zur Rekursion gehörige Matrix für ein festes t

B=zeros(t+5)
C(1,1)=B(1,1)+5/6;

C(1,2:6)=B(1,2:6)-1/6;
for i=2:size(B) 
for j=1:size(B)

if i < size(B)-4
C(i,i)= B(i,i)+1;
C(i,1)= B(i,1)-1/6;
C(i,i+1:i+5)=B(i,i+1:i+5)-1/6;
elseif i > (size(B)-5) & j==i
C(i,j)=B(i,j)+1/6;
elseif i > (size(B)-5) & j~=i 
C(i,j)=B(i,j);
end
end
i=i+1;
end

code:
1:
2:
3:
4:
function [b]= Unbekannt(t)
% berechnet bei Eingabe einer Zahl t ( dimension) die rechte Seite 
a=zeros(t+5,1);
b=1/6+a;


Jetzt muss man MatrixRec(t)\Unbekannt(t)
eingeben und Matlab gibt den gesuchten Vektor aus .
Die zugrundeliegende Formel ist ja :






Initialisierung:


Leider betrachtet mein Programm nur den Fall .
und ich habe keine Ahnung wie ich es anpassen kann.
Vielleicht hast du eine Idee?
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »