Matroids Matheplanet Forum Index
Moderiert von mire2
Mathematische Software & Apps » Matlab » Octave - Funktion als Parameter
Autor
Universität/Hochschule J Octave - Funktion als Parameter
JamesNguyen
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 08.11.2020
Mitteilungen: 300
  Themenstart: 2021-12-12

Hallo, ich habe folgende m.Dateien in Octave geschrieben und kenne mich irgendwie nicht damit aus wie man korrekt Funktionen als Parameter übergibt. Ich weiß nur, dass meine Funktion function [a, b] = fouriercoefficients(f,m) im Befehlsfenster mit [a, b] = fouriercoefficients(@sin,5) klappt aber nun möchte ich [a, b] = fouriercoefficients(triangle,5) oder [a, b] = fouriercoefficients(@triangle,5) Erstens weiß ich nicht was der korrekte Übergabeparameter ist. Zweitens klappt einfach gar nichts sobald ich nicht build-in Funktionen mit @ übergebe. Vielen Dank, JamesNguyen Im Folgenden 4 separate m.Dateien im gleichen Verzeichnis: fouriercoefficients.m triangle.m myintegral.m treppenint.m \sourceon nameDerSprache % Dieses Skript berechnet zu einer Funktion f % die Fourierkoeffizienten der m-ten Partialsumme der Fourierreihe. % Signatur der Funktion fouriercoefficients function [a, b] = fouriercoefficients(f,m) % Listen für Fourierkoeffizienten a = []; b = []; % Schrittweises Berechnen der Fourierkoeffizienten for k = 1:m % Integrand für a_k f1 = @ (x) f(x) .* cos(k * x); % Integrand für b_k f2 = @ (x) f(x) .* sin(k * x); % Liste von Fourierkoeffizienten a_1 bis a_k a = [a (1/pi) * myintegral(f1,0,2*pi)]; % Liste von Fourierkoeffizienten b_1 bis b_k b = [b (1/pi) * myintegral(f2,0,2*pi)]; endfor endfunction % Dieses Skript definiert die 2*pi - periodische Dreiecksfunktion. % Signatur der Funktion triangle function y = triangle(x) y = ( x <= pi/2 ) * x + ( x > pi/2 ) * (1/3) * (2*pi - x); endfunction % Dieses Skript bestimmt das Integral einer Funktion % in einem Intervall näherungsweise bestimmt. % Signatur der Funktion myintegral function y = myintegral(f,a,b) % Startwert von n = 10 n = 10; % Iteration do % Auswertung für n y_alt = treppenint(f,a,b,n); % Auswertung für 2n y = treppenint(f,a,b,2*n); % Verdoppeln von n n *= 2; % bis Differenz sich nicht um mehr als 10^-8 unterscheidet until abs(y-y_alt) <= 10^-8 endfunction % Dieses Skript führt eine numerische Integration von Funktionen % durch, indem es diese durch Treppenfunktionen annähert. % Signatur der Funktion treppenint function y = treppenint(f,a,b,n) % n+1 gleichmäßig verteilte Sprungstellen in [a, b] % n gleichgroße Intervalle in [a, b] v = linspace(a,b,n+1); % n+1 Funktionswerte in den n+1 Sprungstellen v = f(v); % Summe von Funktionswert in linker Intervallgrenze % und rechter Intervallgrenze % für alle n Intervalle v = v(1:end-1) + v(2:end); % Teilen durch zwei von allen n Summen % ergibt n Mittelwerte v = v/2; % n Flächeninhalte der n orientierten Flächen v = v * (b-a)/n; % (Cauchy-)Integral und orientierter Flächeninhalt % stimmt für Treppenfunktion überein y = sum(v); endfunction \sourceoff


   Profil
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 4422
  Beitrag No.1, eingetragen 2021-12-12

\quoteon(2021-12-12 00:38 - JamesNguyen im Themenstart) Zweitens klappt einfach gar nichts sobald ich nicht build-in Funktionen mit @ übergebe. \quoteoff Das liegt allerdings nicht an der Übergabe (denn @triangle ist die richtige Weg, ein function handle auf triangle zu übergeben), sondern daran, dass fouriercoefficients ihr Funktionsargument f nicht nur mit skalaren Werten aufruft und dass deine triangle-Funktion damit im Gegensatz zum eingebauten Sinus nicht umgehen kann: \sourceon octave > sin([1,2]) ans = 0.8415 0.9093 > triangle([1,2]) error: operator *: nonconformant arguments (op1 is 1x2, op2 is 1x2) error: called from triangle at line 3 column 5 \sourceoff Also musst du entweder fouriercoefficients so ändern, dass f nur mit skalaren Werten aufgerufen wird, oder du musst triangle "Array-fest" machen. --zippy


   Profil
JamesNguyen
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 08.11.2020
Mitteilungen: 300
  Beitrag No.2, vom Themenstarter, eingetragen 2021-12-12

Danke, zippy! Tut mir leid, dass ich erst heute antworte. Ich habe die Nachricht bereits gestern gelesen und habe triangle nun "array-fest" gemacht und jetzt klappt es: \sourceon nameDerSprache % Dieses Skript definiert die 2*pi - periodische Dreiecksfunktion. % Signatur der Funktion triangle function y = triangle(x) y = ( x <= pi/2 ) .* x + ( x > pi/2 ) * (1/3) .* (2*pi - x); endfunction \sourceoff ich glaube ich habe auch verstanden, warum es vorher nicht geklappt hat. Das Problem liegt sogar nicht direkt in fouriercoefficients, sondern zwei Ebenen tiefer bei der treppenint Funktion, zu dieser wird nämlich letztlich die Testfunktion durchgereicht. Bei treppenint habe ich nun sehr darauf geachtet möglichst zu "Vektorisieren". So eben in den Zeilen v = linspace(a,b,n+1); % n+1 Funktionswerte in den n+1 Sprungstellen v = f(v); da wird als in f eine Liste eingesetzt. Da ich das beibehalten möchte. Habe ich nur die triangle Funktion angepasst. Das geht ja auch schneller.


   Profil
JamesNguyen hat die Antworten auf ihre/seine Frage gesehen.
JamesNguyen hat selbst das Ok-Häkchen gesetzt.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]