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

Matlab

 

Blackys
Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 25.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.05.2014, 14:22     Titel: Matlab
  Antworten mit Zitat      
Hallo zusammen

Ich studiere Mathematik und habe jetzt als Programmieraufgabe Simpsonregel mit Matlab bekommen. Da ich noch nie mit Matlab programmiert habe, und wir erst nur 4 Vorlesungen hatten, bin ich jetzt echt frustriert und weiss nicht mehr was ich machen soll. Ich soll für 4,6,8 Schritte berechnen. Ich habe hier etwas zusammenprogrammiert doch es funktioniert nicht. Bitte um Hilfe. WÜrde mich über jeden Tipp freuen. Danke im Voraus



Code:
F = inline(input('Geben sie eine Funktion an: ','s')); %(x+0.8)./sqrt(x.^2+1.2)
a = input('Geben Sie die linke Grenze ein, a=  ');
b = input('Geben Sie die rechte Grenze ein, b=  ');

f_werte(a)=F(a);
f_werte(b)=F(b);

I=f_werte(a)+f_werte(b); %letzter und erster aufsummiert

for n  = 4:6:8 % Anzahl der Abschnitte
h  = (b-a) / n ;         % Breite eines Abschnitts
nS = n + 1 ;             % Anzahl der Stützstellen
xS = (a+1) : h : (b-1) ;         % Koordinaten der Stuetzpunkte
yS = F(xS) ;                    % Funktionswerte an den Stuetzstellen


for xS=1:2:(n)  %fuer ungerade k, x1,x3,x5....x n
    f_werte(x(xS)) = 4*yS(xS);
    Summe_ungerade = sum(f_werte(x(1:2:(n)));
end

for xS=2:2:n-1
    f_werte(x(xS)) = 2*yS(xS);
    Summe_gerade = sum(f_werte(2:2:(n-1));

end



end


Simpson = (h/3)*(I+Summe_gerade+Summe_ungerade);
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.05.2014, 15:15     Titel:
  Antworten mit Zitat      
Hallo,

bitte Code-Umgebung verwenden und vor allem schreiben, inwiefern es nicht funktioniert.

Wenn ein String als Funktion aufgefasst werden soll, hilft
Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Blackys
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 25.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.05.2014, 15:15     Titel:
  Antworten mit Zitat      
so habe ich das jetzt ergänzt:


Code:


F = inline(input('Geben sie eine Funktion an: ','s'));
a = input('Geben Sie die linke Grenze ein, a=  ');
b = input('Geben Sie die rechte Grenze ein, b=  ');

f_werte(a)=F(a);
f_werte(b)=F(b);

I=f_werte(a)+f_werte(b); %letzter und erster aufsummiert

for n  = 4:6:8 % Anzahl der Abschnitte
h  = (b-a) / n ;         % Breite eines Abschnitts
nS = n + 1 ;             % Anzahl der Stützstellen
xS = (a+1) : h : (b-1) ;         % Koordinaten der Stuetzpunkte
%yS = F(xS) ;                    % Funktionswerte an den Stuetzstellen


    for k=1:2:n  %fuer ungerade k, x1,x3,x5....x n
    f_werte(k) = 4*F(xS(k));
   
    end
Summe_ungerade = sum(f_werte(x(1:2:(n))));

    for k=2:2:n-1
    f_werte(k) = 2*F(xS(k));
   

    end
   
Summe_gerade = sum(f_werte(2:2:(n-1)));


end


Simpson = (h/3)*(I+Summe_gerade+Summe_ungerade);
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Blackys
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 25.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.05.2014, 15:18     Titel:
  Antworten mit Zitat      
??? Attempted to access xS(1); index out of bounds because
numel(xS)=0.

Error in ==> Simpson3 at 18
f_werte(k) = 4*F(xS(k));



Das ist die Aktuelle Fehlermeldung nach der Eingabe vom Intervall. Vielen Dank für die Hilfe
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 01.05.2014, 17:24     Titel:
  Antworten mit Zitat      
Hallo,
mit Codeumgebung ist der Code-button gemeint, den es beim Schreiben von antworten gibt - ohne ist der Test meist entstellt oder mindestens schwerer zu lesen.

Schau die bitte mal die genaue Zuweisung bei einer for-schleife an (-> Matlabhilfe oder skripte/tutorials im Netz).

Code:

ist mMn falsch. Denn du sagst, dass du ab n = 4 in 6-er Schritten(!) bis zum Endwert 8 iterieren willst!.
D.h. n bekommt den Wert 4. Damit dürfte mindestens die zweite folgende Schleife Probleme bekommen.

Des weiteren versuche bitte mal Breakpoints zu setzen und schau dir an, was z.B. in den Variablen aus der Zeile die dir die Fehlermeldung ausgibt, steht.
Empfehlenswert ist außerdem
Code:

oberhalb deines Quellcodes hinzuschreiben, damit bei auftretenden Fehlern gestoppt wird und du noch nachschauen kannst, was in den Variablen enthalten ist, und warum der Fehler genau auftritt.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
Blackys
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 25.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2014, 09:07     Titel:
  Antworten mit Zitat      
Hey, Martina. Danke erstmal für deine Antwort, dass du dich bemüht hast, an meinem Program zu arbeiten.
So müssen wir aber machen, erst für 4, dann für 6 und dann für 8 Schritte. Und dann vergleichen.

Ich habe jetzt das Program etwas verbessert. Kannst du bitte einen Blick drauf werfen?




Code:
F = inline(input('Geben sie eine Funktion an: ','s')); %(x+0.8)./sqrt(x.^2+1.2)
a = input('Geben Sie die linke Grenze ein, a=  ');
b = input('Geben Sie die rechte Grenze ein, b=  ');

%f_werte(a)=F(a);
%f_werte(b)=F(b);

%I=f_werte(a)+f_werte(b); %letzter und erster aufsummiert

for n  = 4:6:8 % Anzahl der Abschnitte
h  = (b-a) / n ;         % Breite eines Abschnitts
nS = n + 1 ;             % Anzahl der Stützstellen
xS = a:h:b;         % Koordinaten der Stuetzpunkte
yS = F(xS) ;                   % Funktionswerte an den Stuetzstellen
    for k=1:n  %fuer ungerade k, x1,x3,x5....x n
        Rem = rem(k/2);
        if(Rem ==0) %Falls der Rest durch 2 0 ist.
           
            yS(k) = 2*F(xS(k));
        else
            yS(k) = 4*F(xS(k));
        end
    end
end


Sum=sum(yS(k(1:n)));
T1=F(a);
Tb=F(b);

Simpson = (h/3)*(T1+Tb+ Sum);



Es entsteht, nach dem Eingeben von Funktion und den Grenzen, folgender Fehler:


??? Error using ==> inlineeval at 15
Error in inline expression ==> x/(1+x^2)
Matrix must be square.

Error in ==> inline.subsref at 27
INLINE_OUT_ = inlineeval(INLINE_INPUTS_,
INLINE_OBJ_.inputExpr, INLINE_OBJ_.expr);

Error in ==> Simpson7 at 16
yS = F(xS) ; % Funktionswerte an den
Stuetzstellen
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 02.05.2014, 09:32     Titel:
  Antworten mit Zitat      
ich würde dich nochmal darum bitten die code umgebung zu verwenden.
Sowohl Mmmartina als auch Harald haben dich schon darauf hingewiesen.
grüße winkow
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Blackys
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 25.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2014, 09:33     Titel:
  Antworten mit Zitat      
Hallo

Wie soll es denn aussehen? Ich weiss gerade echt nicht... Und in welcher Zeile genau?

Dankeschön
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 02.05.2014, 09:47     Titel:
  Antworten mit Zitat      
Blackys hat Folgendes geschrieben:

So müssen wir aber machen, erst für 4, dann für 6 und dann für 8 Schritte. Und dann vergleichen.


Lies bitte nochmal genau das, was ich oben geschrieben habe zu deinem ersten Forschleifenaufruf.
Denn du machst eben NICHT erst für 4, dann für 6, dann für 8 schritte.

Teste es doch mal bitte selber in Matlab.

Aufbau ist folgender:
[Startwert:Schrittbreite:Endwert]
Wenn [1:2:9] da steht, ergibt das die Werte 1,3,5,7,9
Wenn [4:6:8] da steht, ergibt dies: 4
Mehr nicht!
'Du möchtest aber 4, 6, 8 haben. Dazu musst du [4:2:8] angeben.

Nutzt die Breakpoints?
Fehler: es muss mMn rem(k,2) heißen

Bis du sicher, dass du die innere Schleife bis n laufen lassen willst, statt bis n+1 (Anzahl der Stützstellen)? Denn du berechnest dir vor der inneren Schleife die Funktionswerte der Stützstellen (= n+1) um dann in der inneren Schleife diese dort bis end-1 zu überschreiben.

Sollen diese Funktionswerte überhaupt überschrieben werden, oder stattdessen extra gespeichert werden?
UND sollen diese Funtkionswerte für jedem Schleifendurchlauf extra gespeichert werden? Denn derzeit überschreibst du mit jedem weiteren Aufrufen der äußerden Schleife (Werte 6 und 8 ) auch die vorherigen Ergebnisse.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))

Zuletzt bearbeitet von Mmmartina am 02.05.2014, 10:22, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Blackys
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 25.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2014, 10:13     Titel:
  Antworten mit Zitat      
Hey, Martina

Vielen Vielen Vielen Dank für deine Hilfe.
Ja, das mit 4:2:8 habe ich jetzt gesehen, war ein bloedes Fehler. Ist ja auch klar so.

Das ist rem ist ganz neu fuer mich, habe ausm Google rausgefischt, wie ich das mit dem Rest machen soll. Das quasi es soll erst mal positive Zahl sein, und dann negative.

Und das mit n habe ich gemacht, weil ich ja den ersten und den letzten Wert separat ausrechne oder meine ich da etwas falsch ?

Danke
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Blackys
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 25.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2014, 10:16     Titel:
  Antworten mit Zitat      
Kommt nun dieser Fehler:



??? Error using ==> inlineeval at 15
Error in inline expression ==> x/(1+x^2)
Matrix must be square.

Error in ==> inline.subsref at 27
INLINE_OUT_ = inlineeval(INLINE_INPUTS_,
INLINE_OBJ_.inputExpr, INLINE_OBJ_.expr);

Error in ==> Simpson7 at 16
yS = F(xS) ; % Funktionswerte an den
Stuetzstellen
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.05.2014, 10:29     Titel:
  Antworten mit Zitat      
Hallo,

verwende komponentenweise Operationen, wie du das zuvor ja schon angedeutet hast:
./ statt / und .^ statt ^

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Blackys
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 25.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2014, 10:45     Titel:
  Antworten mit Zitat      
Hallo, Harald
Danke fuer deine Antwort.

In welcher Zeile denn?

LG
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Blackys
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 25.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2014, 10:46     Titel:
  Antworten mit Zitat      
das aktuelle Program sieht nun so aus:


Code:
%F = inline(input('Geben sie eine Funktion an: ','s')); %(x+0.8)./sqrt(x.^2+1.2)
a = input('Geben Sie die linke Grenze ein, a=  ');
b = input('Geben Sie die rechte Grenze ein, b=  ');

%f_werte(a)=F(a);
%f_werte(b)=F(b);

%I=f_werte(a)+f_werte(b); %letzter und erster aufsummiert

for n=4:2:8             % Anzahl der Abschnitte
h =(b-a)/n;             % Breite eines Abschnitts
nS =n + 1;               % Anzahl der Stützstellen
xS =a:h:b;              % Koordinaten der Stuetzpunkte
yS =F(xS);              % Funktionswerte an den Stuetzstellen
    for k=1:n           %fuer ungerade k, x1,x3,x5....x n
        Rem = rem(k,2);
        if(Rem ==0)     %Falls der Rest durch 2 0 ist.
           
            yS(k)=2*F(xS(k));
        else
            yS(k)=4*F(xS(k));
        end
    end



Sum=sum(yS(k(1:n)));
T1=F(a);
Tb=F(b);

Simpson = (h/3)*(T1+Tb+Sum);


fprintf('\n');
fprintf('Die Simpsonregel liefert folgende Näherung,')
fprintf('Abschnittsanzahl ')
fprintf(num2str(n))
fprintf('\n');
disp(num2str(Simpson,5))
end
 
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.05.2014, 10:57     Titel:
  Antworten mit Zitat      
Hallo,

und? Funktioniert's? Wenn nicht, wo liegen die weiteren Probleme?

Das schließende Code-Tag muss einen / enthalten, damit die Code-Formatierung angewendet wird.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.