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

Problem mit for-Schleife und trapz

 

Peuk
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 08.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2013, 15:31     Titel: Problem mit for-Schleife und trapz
  Antworten mit Zitat      
Hallo,

ich habe folgendes Problem. Für die Auswertung neines Messsignals muss ich u.a. eine doppelte Summation integrieren. Mein Programm sieht so aus:

Code:
syms a b m sigma;

m = 10;

for a = 1:1:m
    for b = 1:1:m
        y = y + a .* b .* exp(-(b.^2 + a.^2)./(4 .* m.^2 .* sigma.^2)) .* besseli(0,sigma) .* b .* a ./(2 .* m.^2 .* sigma.^2);
    end
end

sigma = 0.1:0.1:1;
A = trapz(sigma,y);
 


Dabei tritt das Problem auf, dass "y" symbolisch ist und demzufolge "trapz" damit nicht zurecht kommt. Kopiere ich allerdings das Ergebnis der Schleife, also:
Code:

sigma = 0.1:0.1:1;
y = ResultatSchleife;
trapz(sigma,y);
 


funktioniert das Ganze. Mein Ziel ist aber, dass man ein "m" eingibt und dann der Rest automatisch passiert, sprich das manuelle Kopieren von einem Resultat in den Quelltext scheidet als Lösung aus. Hat jemand eine Idee, wie ich das Ergebnis der Schleife für die trapz-Funktion nutzbar machen kann?
Vielen Dank im Voraus!
Private Nachricht senden Benutzer-Profile anzeigen


Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 08.10.2013, 16:18     Titel:
  Antworten mit Zitat      
So wie ich das sehe, müsstest du doch nur Sigma vor der Schleife definieren und y mit einem Startwert versehen (z.B. y = 0). Dann sollte das auch ohne syms laufen.
_________________

LG
Martina

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

Forum-Meister


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

es ist meines Erachtens nicht sinnvoll, Terme symbolisch aufzustellen und sie dann numerisch zu integrieren.

Besser (und vermutlich schneller) wäre meines Erachtens:
Code:

m = 10;
sigma = 0.1:0.1:1;
y = 0; % oder was y am Anfang sein soll
for a = 1:1:m
    for b = 1:1:m
        y = y + a .* b .* exp(-(b.^2 + a.^2)./(4 .* m.^2 .* sigma.^2)) .* besseli(0,sigma) .* b .* a ./(2 .* m.^2 .* sigma.^2);
    end
end
A = trapz(sigma,y);


Für die direkte Beantwortung der Frage bräuchte man vermutlich SUBS oder EVAL.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 08.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.10.2013, 16:14     Titel:
  Antworten mit Zitat      
Sigma ist die Integrationsvariable, da macht eine Wertzuweisung vorher doch keinen Sinn? Ich bekäme dann nur konkrete Zahlenwerte von der Schleife über die dann integriert wird, wird das Integral quasi immer = 0 sein. Oder habe ich einen Denkfehler?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

bei
Code:
A = trapz(sigma,y);

muss y die Funktionswerte für sigma enthalten. Daher macht es sehr wohl Sinn, speziell die Funktionswerte für sigma zu errechnen und dann die Trapezregel anwenden zu lassen.

Alternativ kannst du die Funktion integral verwenden. Diese wertet die Funktion dann an bestimmten Punkten aus und errechnet dafür das Integral:

Code:
function A = berechneIntegral

A = integral(@integrand, 0.1, 1);

function y = integrand(sigma)

m = 10;
y = 0; % oder was y am Anfang sein soll
for a = 1:1:m
    for b = 1:1:m
        y = y + a .* b .* exp(-(b.^2 + a.^2)./(4 .* m.^2 .* sigma.^2)) .* besseli(0,sigma) .* b .* a ./(2 .* m.^2 .* sigma.^2);
    end
end


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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 08.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.10.2013, 17:07     Titel:
  Antworten mit Zitat      
Mich macht folgendes stutzig: Ich habe die vorgeschlagene Variante probiert und mit der "manuellen" Variante verglichen. Dabei kommt nicht dasselbe heraus. Mit "manuell" meine ich, dass ich erst die Schleife die Funktion errechnen lasse und diese dann einfüge:
Code:

sigma=0.1:0.1:1
y=Ergebnis der for-Schleife
trapz(sigma,y)
 


Müsste aber eigentlich zum identischen Ergebnis führen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

welche von den beiden vorgeschlagenen Varianten?

Wenn ich das von dir beschriebene mache, bekomme ich eine Fehlermeldung:
Error using ^
Inputs must be a scalar and a square matrix.
To compute elementwise POWER, use POWER (.^) instead.

Das verwundert mich auch nicht weiter, da die Formel zumindest bei mir (R2012b) eben ^ statt .^ enthält.

Wenn ich nach der for-Schleife wie vorgeschlagen subs anwende und folgendes ausführe:
Code:
y = subs(y, sigma, 0.1:0.1:1)
sigma=0.1:0.1:1;
trapz(sigma,y)

bekomme ich genau dasselbe Ergebnis (592.7174) wie bei meinem ersten Vorschlag.

Dass das Ergebnis beim zweiten Vorschlag (593.4292) anders ist, ist kein Wunder, da ja eine andere (und genauere) Integrationsmethode verwendet wird.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 08.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.10.2013, 14:21     Titel:
  Antworten mit Zitat      
Hallo,

ja stimmt, habe vergessen zu erwähnen, dass ich alle ^,* und / mit entsprechend .^,.* und ./ ersetzt habe, dann funktionierts. Aber sei es drum, ich habe mich jetzt für die Variante mit der Funktion "integral" entschieden, funktioniert einwandfrei.
Vielen Dank für die Hilfe!

Gruß Erik
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.