www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Matlab" - Doppelsumme in Matlab
Doppelsumme in Matlab < Matlab < Mathe-Software < Mathe < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Doppelsumme in Matlab: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 17:04 Do 07.06.2012
Autor: Katthi

Hallo Leute,

ich habe mal eine Frage zur Implementierung einer Doppelsumme in matlab.
Und zwar soll ich eine Funktion programmieren, die mir die Abweichung der Spalten von einem Orthonormalsystem angibt. Dabei habe ich gegeben, wie das aussehen soll und zwar,
orth_error(X) = || [mm] X^T*X [/mm] - [mm] I||^2 [/mm] und die norm ist die frobenius norm und I die Einheitsmatrix.
Nur wie programmiere ich die Frobeniusnorm? da kommen ja zwei Summenzeichen drin vor, einmal über i und einmal über j.
habe leider keinen Weg gefunden, dass es irgendwie läuft, immer kommen irgendwelche Fehler..

und dann soll ich eine vandermonde-matrix mit einem angegeben Code aufstellen:
function [V]= vandermonde(n)
x = 1:n;
for j = 1:n
V(:,j) = x.^(j-1);
end

aber so läuft das bei mir nicht. sieht das denn so richtig aus? Weil allgemeines wo eine Variable auch wirklich drin steht, kann mtlab doch garnicht?! Sollen dann diese Vandermonde-Matrix für n= 5:5:150 auf verschiedene Verfahren loslassen und dann davon orth_error bestimmen. aber wie gesagt läuft beides leider nicht =(

ich hoffe, dass mir jemand von euch weiterhelfen kann.

Viele Grüße

Katthi

        
Bezug
Doppelsumme in Matlab: Antwort
Status: (Antwort) fertig Status 
Datum: 19:09 Do 07.06.2012
Autor: wieschoo


> Hallo Leute,
>  
> ich habe mal eine Frage zur Implementierung einer
> Doppelsumme in matlab.
>  Und zwar soll ich eine Funktion programmieren, die mir die
> Abweichung der Spalten von einem Orthonormalsystem angibt.
> Dabei habe ich gegeben, wie das aussehen soll und zwar,
>  orth_error(X) = || [mm]X^T*X[/mm] - [mm]I||^2[/mm] und die norm ist die
> frobenius norm und I die Einheitsmatrix.
>  Nur wie programmiere ich die Frobeniusnorm?

Eigentlich gar nicht, wenn es nicht explizit verlangt wird:

norm(X'*X-eye(n),'fro')

für die Größe n und eine Matrix [mm] $X\in \IR^{n\times n}$ [/mm]

> da kommen ja
> zwei Summenzeichen drin vor, einmal über i und einmal
> über j.
> habe leider keinen Weg gefunden, dass es irgendwie läuft,
> immer kommen irgendwelche Fehler..
>  
> und dann soll ich eine vandermonde-matrix mit einem
> angegeben Code aufstellen:
>  function [V]= vandermonde(n)
>  x = 1:n;
>  for j = 1:n
>  V(:,j) = x.^(j-1);
>  end

Die geht doch!
vandermonde(5) gibt das richtige aus!


welches Problem hast du mit:

n=6;
X=vandermonde(n);
ergebnisnorm= norm(X'*X-eye(n),'fro');

>  
> aber so läuft das bei mir nicht. sieht das denn so richtig
> aus? Weil allgemeines wo eine Variable auch wirklich drin
> steht, kann mtlab doch garnicht?! Sollen dann diese
> Vandermonde-Matrix für n= 5:5:150 auf verschiedene
> Verfahren loslassen und dann davon orth_error bestimmen.
> aber wie gesagt läuft beides leider nicht =(
>
> ich hoffe, dass mir jemand von euch weiterhelfen kann.
>  
> Viele Grüße
>  
> Katthi


Bezug
                
Bezug
Doppelsumme in Matlab: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 19:15 Do 07.06.2012
Autor: Katthi

ah ja die vandermonde passt. hatte die als V.m abgespeichert, dann muss ich ja auch V(5) abrufen.. oka..

aber die 'fro' von matlab darf ich eben nicht benutzen, leider nur zur Kontrolle ;)  ich muss das selber programmieren und da stolpere ich halt über die Doppelsumme. hatte das mit einer for schleife angefangen, aber weiß nicht, wie genau der Hauptteil dann aussieht...

Viele Grüße

Katthi

Bezug
                        
Bezug
Doppelsumme in Matlab: Antwort
Status: (Antwort) fertig Status 
Datum: 19:24 Do 07.06.2012
Autor: wieschoo


> ah ja die vandermonde passt. hatte die als V.m
> abgespeichert, dann muss ich ja auch V(5) abrufen.. oka..
>  
> aber die 'fro' von matlab darf ich eben nicht benutzen,
> leider nur zur Kontrolle ;)

Schade ;-)

> ich muss das selber
> programmieren und da stolpere ich halt über die
> Doppelsumme. hatte das mit einer for schleife angefangen,

Genauso

> aber weiß nicht, wie genau der Hauptteil dann aussieht...

Ich gib dir mal Bausteine:

[mm]\sum_{i=1}^na_{ji}[/mm] entspricht sum(A(j,:))

[mm]a_{ij}^2[/mm] erreicht man durch A(i,j).^2   (der Punkt dazwischen ist wichtig!)

[mm] $\sum_{i=1}^n \text{irgendwas}$ [/mm] entspricht:
~~~~~~~
totalsum=0;
for i=1:n
totalsum = totalsum + irgendwas
end
~~~~~~~~

Naja und die Wurzel ziehst du über sqrt()
  

Bezug
                                
Bezug
Doppelsumme in Matlab: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 19:35 Do 07.06.2012
Autor: Katthi

hmm ja.. also mein Problem ist, dass ich ja für das [mm] (a_ij)^2 [/mm] ja quasi das einsetzen muss, was in der Frobeniusnorm drin steht. also A'*A-I. soll ich das dann irgendwie Y nennen oder so? und kann ich dann einfach sagen Y(i,j)?
und ich habe ja eine summe, die über j läuft und eine über i. welches sum entspricht denn dann welchem Index? entspricht dann dein "irgendwas" der zweiten summe??




Bezug
                                        
Bezug
Doppelsumme in Matlab: Antwort
Status: (Antwort) fertig Status 
Datum: 19:44 Do 07.06.2012
Autor: wieschoo


> hmm ja.. also mein Problem ist, dass ich ja für das
> [mm](a_ij)^2[/mm] ja quasi das einsetzen muss, was in der
> Frobeniusnorm drin steht. also A'*A-I. soll ich das dann
> irgendwie Y nennen oder so?

Den Namen darfst du dir frei aussuchen.

> und kann ich dann einfach sagen
> Y(i,j)?

Lass das doch erst einmal weg und schreibe dir eine Matlab-Funktion, die für eine gegebene Matrix A (oder wie auch immer) die Norm berechnet. Im Prinzip brauchst du doch unabhängig von der Aufgabenstellung nur die Matlabfunktion nachbauen.

> und ich habe ja eine summe, die über j läuft und eine
> über i. welches sum entspricht denn dann welchem Index?
> entspricht dann dein "irgendwas" der zweiten summe??

Das waren doch nur Vorschläge, wie ich die Funktion eben geschrieben habe.

>  

Dann doch ausführlicher
for i=1:n
   for j=1:n
     ...
   end
end




Bezug
                                                
Bezug
Doppelsumme in Matlab: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 20:04 Do 07.06.2012
Autor: Katthi

aaaaaaalso :D

ich bekomme zumindest schon mal Werte.
habe jetzt zwei Funktionen, einmal die Norm und dann noch eine Funktion, wo ich dann das, was in der Norm stehen soll definiert habe, also als Matrix B.
Aber wenn ich dass dann in meiner Funktion orth_error aufrufe, dann bekomme ich ganz viele sum raus und eigentlich will ich ja dieses orth_error als Wert. ist das dann mein sum Wert? (mal davon abgesehen, dass ich garnicht richtig verstehe, wie dieser Wert mir quantitativ angeben soll, wie stark die Spalten der Matrix von einem Orthonormalsystem abweichen.....)

so sieht es bei mir aus:

function e = orth_error(A)
[n,m] = size(A);
sum = 0;
for i = 1:n
   for j = 1:m
      sum = sum + B.^2 ;
   end
end

end


function B = matrix (~,~)

B = A'*A - eye(size(A));

end


die Wurzel hebt sich ja weg, da bei der Norm ja die Wurzel wäre, aber ich diese Norm quadrieren soll...

Bezug
                                                        
Bezug
Doppelsumme in Matlab: Antwort
Status: (Antwort) fertig Status 
Datum: 20:16 Do 07.06.2012
Autor: wieschoo


> aaaaaaalso :D
>  
> ich bekomme zumindest schon mal Werte.
>  habe jetzt zwei Funktionen, einmal die Norm und dann noch
> eine Funktion, wo ich dann das, was in der Norm stehen soll
> definiert habe, also als Matrix B.
>  Aber wenn ich dass dann in meiner Funktion orth_error
> aufrufe, dann bekomme ich ganz viele sum raus und
> eigentlich will ich ja dieses orth_error als Wert. ist das
> dann mein sum Wert? (mal davon abgesehen, dass ich garnicht
> richtig verstehe, wie dieser Wert mir quantitativ angeben
> soll, wie stark die Spalten der Matrix von einem
> Orthonormalsystem abweichen.....)
>  
> so sieht es bei mir aus:
>  
> function e = orth_error(A)
>  [n,m] = size(A);
> sum = 0;
>  for i = 1:n
>     for j = 1:m

B=A(i,j); fehlt doch hier?!

>        sum = sum + B.^2 ;

Das ist mir nicht so ganz klar, was da das B macht.

>     end
>  end
>
> end

Naja das ist dann aber nicht der orth_error sondern eher, die Norm zum Quadrat.

Ich habe es so ähnlich:

function y = frobnorm(A)
    [n,m] = size(A);y = 0;
    for i=1:n
        y = y + sum(A(i,:).^2);
    end
    y=sqrt(y);
end
~~~~~~~~~~~~~~~~~+

A=rand(5);
frobnorm(A'*A-eye(5))

>  
>
> function B = matrix (~,~)

Das kenne ich leider nicht mit der Tilde.

>  
> B = A'*A - eye(size(A));
>  
> end
>
>
> die Wurzel hebt sich ja weg, da bei der Norm ja die Wurzel
> wäre, aber ich diese Norm quadrieren soll...

Ja, das stimmt.

Bezug
                                                                
Bezug
Doppelsumme in Matlab: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 20:24 Do 07.06.2012
Autor: Katthi

das mit der Tilde hat der mir mal angezeigt, dass man das so machen soll, wenn das i und j variabel ist....

ich glaube ich habe das auch nicht gut dargestellt, wie genau meine Aufgabe ist...
also ich soll dieses orth_error als funktion schreiben.
Mein B ist jetzt einfach das, wie wir in der Aufgabe das innerhalb der Frobeniusnorm definiert haben.
Ist das denn jetzt bei mir eine Summe über beide Indizes? Weil bei dir hast du ja nur von i = 1:n...


es läuft also auf soetwas hinaus in der Aufgabe:
um eine Vandermondematrix V (n) beliebiger Größe n zu erstellen. Schreiben
Sie ein Programm, das für n = 5; 10; : : : ; 150 die Q-Faktoren von V (n)
per
(1) Gram-Schmidt Algorithmus
(2) Modi ziertem Gram-Schmidt Algorithmus
(3) qr-Funktion aus matlab
berechnet. Die Fehlerindikatoren [mm] e_k [/mm] = [mm] orth_error(Q_k), [/mm] k = 1; 2; 3 der drei
Verfahren sollen (in der genannten Reihenfolge) als Zeilen einer Tabelle in
Exponentialdarstellung ausgeben werden:
fprintf('%d: %e %e [mm] %e\n',n, [/mm] e1, e2, e3);

meinst du ich soll dann die frobeniusnorm separat noch als function schreiben und dann erst in die orth_error function einfügen??

tut mir leid für die Unübersichtlichkeit...

Bezug
                                                                        
Bezug
Doppelsumme in Matlab: Antwort
Status: (Antwort) fertig Status 
Datum: 20:34 Do 07.06.2012
Autor: wieschoo


> das mit der Tilde hat der mir mal angezeigt, dass man das
> so machen soll, wenn das i und j variabel ist....
>
> ich glaube ich habe das auch nicht gut dargestellt, wie
> genau meine Aufgabe ist...
> also ich soll dieses orth_error als funktion schreiben.
>  Mein B ist jetzt einfach das, wie wir in der Aufgabe das
> innerhalb der Frobeniusnorm definiert haben.

Das ist unglücklich, wenn du das B global definierst. Dann ist es zwar da und die Funktion kann darauf zugreifen. Bloß, merkt man sich dass? Dann lieber als Parameter.

Also

function y= orth_err(X)
  n = size(X);
  y = frobnorm(X'*X-eye(n));
end

Dann ist es lesbar.

> Ist das denn jetzt bei mir eine Summe über beide Indizes?
> Weil bei dir hast du ja nur von i = 1:n...

Ich spare mir die innere Schleife. Für

for j=1:n
   summe = summe + a(i,j)
end

kann man auch

summe = sum(A(i,:))

schreiben. "A(i,:)" ist die i-te Zeile und "sum" summiert alle Elemte auf.

Ausführlich wäre es dann:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function y = frobnorm(A)
    [n,m] = size(A);y = 0;
    for i=1:n
        for j=1:n
            y= y + A(i,j) ^ 2;
        end

    end
    y=sqrt(y);
end
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function y = frobnorm(A)
    [n,m] = size(A);y = 0;
    for i=1:n
        y = y + sum(A(i,:).^2);
    end
     y=sqrt(y);
end
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

>  
>
> es läuft also auf soetwas hinaus in der Aufgabe:
>  um eine Vandermondematrix V (n) beliebiger Größe n zu
> erstellen.

haben wir ja schon.

> Schreiben
>  Sie ein Programm, das für n = 5; 10; : : : ; 150 die
> Q-Faktoren von V (n)
>  per
>  (1) Gram-Schmidt Algorithmus
>  (2) Modi ziertem Gram-Schmidt Algorithmus
>  (3) qr-Funktion aus matlab
>  berechnet.

Das sind dann wohl 3 weitere Funktionen.

> Die Fehlerindikatoren [mm]e_k[/mm] = [mm]orth_error(Q_k),[/mm] k
> = 1; 2; 3 der drei
>  Verfahren sollen (in der genannten Reihenfolge) als Zeilen
> einer Tabelle in
>  Exponentialdarstellung ausgeben werden:
>  fprintf('%d: %e %e [mm]%e\n',n,[/mm] e1, e2, e3);
>  
> meinst du ich soll dann die frobeniusnorm separat noch als
> function schreiben und dann erst in die orth_error function
> einfügen??

Ja. Das denke ich schon. Da würde ich auch die paar Millisekunden in Kauf nehmen, die das länger dauert. Irgendwann kann man die Funktionen noch einmal gebrauchen, und dann muss man sich erinnern, was man mal geschrieben hat.

>  
> tut mir leid für die Unübersichtlichkeit...

Du müsstest mal meine Mitschriften sehen!

Bezug
                                                                                
Bezug
Doppelsumme in Matlab: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 20:45 Do 07.06.2012
Autor: Katthi

also das sieht schonmal gut aus, wenn ich das mal mit V(5) z.B. teste, dann kommt da auch nen schön kleiner Fehler raus, das ist dann ja denke ich mal passend =)

Oh man ich bin dir mega dankbar, jedes mal ziehst du mich aus meinem Gehirnchaos :D

Sooo, aber ich weiß nicht, wie ich das dann für den Rest der Aufgabe alles kombinieren soll.
die beiden Gram-Schmidt-Verfahren habe ich schon, Wobei der mir beim klassischen immer Q und R ausgibt, obwohl ich das garnicht will, und meistens auch noch nen ans, weißt du woran das liegt?

Also ich kann das ja schon mal so anfangen, dass ich sage
n = [5:5:150]
for k = n
      und dann jetzt irgendwie die Verfahren,
end
dann geht der doch alle n durch??



Bezug
                                                                                        
Bezug
Doppelsumme in Matlab: Antwort
Status: (Antwort) fertig Status 
Datum: 21:32 Do 07.06.2012
Autor: wieschoo


> also das sieht schonmal gut aus, wenn ich das mal mit V(5)
> z.B. teste, dann kommt da auch nen schön kleiner Fehler
> raus, das ist dann ja denke ich mal passend =)
>  
> Oh man ich bin dir mega dankbar, jedes mal ziehst du mich
> aus meinem Gehirnchaos :D

;-)

>  
> Sooo, aber ich weiß nicht, wie ich das dann für den Rest
> der Aufgabe alles kombinieren soll.
>  die beiden Gram-Schmidt-Verfahren habe ich schon,

Das ist gut!

> Wobei
> der mir beim klassischen immer Q und R ausgibt, obwohl ich
> das garnicht will,

Wenn du [Q,R] = deineFunktion(...)
schreibst, dann kannst du ja dann mit Q weiterarbeiten (sofern auch Q und R zurückgegeben werden)

> und meistens auch noch nen ans, weißt
> du woran das liegt?

Irgendwo fehlt da am Ende eines Befehls ein Semikolon. Dieses würde nämlich diese ans-Ausgabe unterrdücken
y=1:5
y=1:5;

>  
> Also ich kann das ja schon mal so anfangen, dass ich sage
>  n = [5:5:150]
>   for k = n
>        und dann jetzt irgendwie die Verfahren,
>   end
>  dann geht der doch alle n durch??

Sollst du ja laut Aufgabenstellung auch.

Ich würde das genauso machen, wie du schriebst:

DATENMATRIX = zeros(30,3) % hier werden Fehler ortherror abgelegt
currentpos = 1;
for n=5:5:150
   % Matrix erstellen
   % erstes Verfahren drauf anwenden
   % das ortherror berechnen
   DATENMATRIX(currentpos,1) = ortherr; % in Zeile currentpos Spalte 1
   % zweite Verfahren drauf anwenden
   % das ortherror berechnen
   DATENMATRIX(currentpos,2) = ortherr; % in Zeile currentpos Spalte 2
   % dritte Verfahren drauf anwenden
   % das ortherror berechnen
   DATENMATRIX(currentpos,3) = ortherr; % in Zeile currentpos Spalte 3

   currentpos = currentpos+1; % neue Zeile in DATENMATRIX
end






Bezug
                                                                                                
Bezug
Doppelsumme in Matlab: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 21:43 Do 07.06.2012
Autor: Katthi

ich muss das mit so einem bestimmten Befehl in eine Tabelle schreiben lassen leider... =(
fprintf('%d: %e %e [mm] %e\n',n, [/mm] e1, e2, e3);

somit muss ich das ja irgendwie anders machen.. oder kann ich das dann einfach bei dir einfügen? nur halt ohne Datenmatrix, sondern das man das irgendwie mit e1,e2,e3 benennt??

habe das jetzt so dann gemacht:
n = [5:5:150];

for k = n

   V(k); % Matrix erstellen
  
   Q1 = qr_gram_schmidt(V(k));% erstes Verfahren drauf anwenden
   e1 = orth_error(Q1);% das ortherror berechnen
  
   Q2 = qr_gram_schmidt(V(k)); % zweite Verfahren drauf anwenden
   e2 = orth_error(Q2);% das ortherror berechnen
  
   Q3 = qr(V(k)); % dritte Verfahren drauf anwenden
   e3 = orth_error(Q3);% das ortherror berechnen
end
  
fprintf('%d: %e %e [mm] %e\n',n, [/mm] e1, e2, e3);

wenn ich das laufen lasse wirft der mir aber nur eine Tabelle in 20er Schritten aus...


Bezug
                                                                                                        
Bezug
Doppelsumme in Matlab: Antwort
Status: (Antwort) fertig Status 
Datum: 22:06 Do 07.06.2012
Autor: wieschoo


> ich muss das mit so einem bestimmten Befehl in eine Tabelle
> schreiben lassen leider... =(
>  fprintf('%d: %e %e [mm]%e\n',n,[/mm] e1, e2, e3);
>
> somit muss ich das ja irgendwie anders machen.. oder kann
> ich das dann einfach bei dir einfügen? nur halt ohne
> Datenmatrix, sondern das man das irgendwie mit e1,e2,e3
> benennt??
>
> habe das jetzt so dann gemacht:
>  n = [5:5:150];
>  
> for k = n
>  
> V(k); % Matrix erstellen
>    
> Q1 = qr_gram_schmidt(V(k));% erstes Verfahren drauf
> anwenden
>     e1 = orth_error(Q1);% das ortherror berechnen
>    
> Q2 = qr_gram_schmidt(V(k)); % zweite Verfahren drauf
> anwenden
>     e2 = orth_error(Q2);% das ortherror berechnen
>    
> Q3 = qr(V(k)); % dritte Verfahren drauf anwenden
>     e3 = orth_error(Q3);% das ortherror berechnen

end

>    
> fprintf('%d: %e %e [mm]%e\n',n,[/mm] e1, e2, e3);
>

end

> wenn ich das laufen lasse wirft der mir aber nur eine
> Tabelle in 20er Schritten aus...
>  


Bezug
                                                                                                                
Bezug
Doppelsumme in Matlab: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 22:10 Do 07.06.2012
Autor: Katthi

mist so hatte ich es erst ;)

und das mit den 20er Schritten, kann man das irgendwie beheben?


Bezug
                                                                                                                        
Bezug
Doppelsumme in Matlab: Antwort
Status: (Antwort) fertig Status 
Datum: 22:42 Do 07.06.2012
Autor: wieschoo


> mist so hatte ich es erst ;)
>  
> und das mit den 20er Schritten, kann man das irgendwie
> beheben?

Ich erkenn dein Problem nicht. So ähnlich ist doch dein Quelltext ?

for k=5:5:150
  A=rand(5);
  Q= qr(A);
  e=norm(Q);
  fprintf('%d:\  n', e);
end

Bei dir fehlt ein \  n (ohne Leerzeichen dazwischen)

Bezug
                                                                                                                                
Bezug
Doppelsumme in Matlab: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 22:45 Do 07.06.2012
Autor: Katthi

na so stand es auf dem Blatt ;)

vielen vielen Dank dir mal wieder =)

Viele Grüße

Katthi

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]