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

Optimale Schrittweite

 

MarcelF6
Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 18.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.05.2012, 21:40     Titel: Optimale Schrittweite
  Antworten mit Zitat      
Guten Abend miteinander

Ich habe eine Funktion als parameterabhängiges Integral gegeben:
F(x) = integral_0^1(log(x-y),y) auf dem Intervall [1.5, 2].

Um das Integral zu approximieren, wird die summierte Trapezregel mit einer festen Schrittweite 1/n verwendet. (das wäre dann die Funktion F_n(x). )

Nun soll in Abhängigkeit von n die optimale Schrittweite h zur numerischen Differentiation der Funktion F mittels symmetrischer Differenz [d.h. F'(x) = ((F_n(x+h) - F_n(x-h))/(2h)) ] bestimmt werden.
Meine Frage: Wie kann ich diese finden? Durch Probieren oder geht das auch "systematischer"?

Ich habe momentan den folgenden Code:
Code:
function sumTrap

a = 3/2;
b = 2;
n = 10;
h = 1/n;

x=linspace(a,b,100);
y=SNCFf(x);
I=quad(y);

%1a. Knoten bestimmen
    xt(1,1)=a;
    for i=2:n
        xt(1,i)=a+h*(i-1);
    end
    xt(1,n+1)=b;
   
    %1b. Funktion auswerten
    yt=SNCFf(xt);
       
    %1c. Trapezregel
    ITS=yt(1,1)+yt(1,n+1);
    for i=2:n;
        ITS=ITS+2*yt(1,i);
    end
    ITS=h*0.5*ITS;
    disp(' ')
    disp('Trapezregel, Ordnung 2')
    disp('----------------------------')
    fprintf('ITS_%g=%f',n,ITS)
    disp(' ')
    et=abs(I-ITS);
    fprintf('FehlerTS= %f',et)
    disp(' ')  

end

function y=SNCFf(x)
y=log(x-y);
end


Der Code hat aber zudem noch ein paar Fehler mit quad und der Funktion (d.h. mit dem 'y') selber, die ich bisher noch nicht lösen konnte.
Was muss ich wie ändern?

Besten Dank für die Hilfe!
Marcel
Private Nachricht senden Benutzer-Profile anzeigen


Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 02.05.2012, 11:01     Titel:
  Antworten mit Zitat      
Was ist denn der Fehler?

Generell würde ich erstmal rumprobieren und [edit: mir] merken, in welchem Bereich sinnvolle Ergebnisse kommen. Den Bereich mit ner for-schleife abbilden, Differenzen in einen Vektor und fertig.
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
Private Nachricht senden Benutzer-Profile anzeigen
 
MarcelF6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 18.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2012, 14:11     Titel:
  Antworten mit Zitat      
Also der Fehler ist folgender:
Zitat:
Error using fcnchk (line 103)
If FUN is a MATLAB object, it must have an feval method.

Error in quad (line 62)
f = fcnchk(funfcn);

Error in sumTrap (line 12)
I=quad(y);


Das Problem hängt also mit quad zusammen - allerdings konnte ich es bisher noch nicht lösen.

Ok, danke für den Input! Dann werd ich das - sobald der Code läuft - genau so machen Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 02.05.2012, 14:14     Titel:
  Antworten mit Zitat      
Tjoa, was ist denn SNCFf?
quad braucht ja mMn ein function handle (-> @)
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
Private Nachricht senden Benutzer-Profile anzeigen
 
MarcelF6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 18.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2012, 15:02     Titel:
  Antworten mit Zitat      
Danke für die schnelle Antwort!

Nun habe ich den Code so weit:
Code:
function sumTrap

a = 3/2;
b = 2;
n = 10;
h = 1/n;

x=linspace(a,b,100);
y=SNCFf(x);
I=quad(y,a,b);

    xt(1,1)=a;
    for i=2:n
        xt(1,i)=a+h*(i-1);
    end
    xt(1,n+1)=b;

    yt=SNCFf(xt);
       
    ITS=yt(1,1)+yt(1,n+1);
    for i=2:n;
        ITS=ITS+2*yt(1,i);
    end
    ITS=h*0.5*ITS;
    disp(' ')
    disp('Trapezregel, Ordnung 2')
    disp('----------------------------')
    fprintf('ITS_%g=%f',n,ITS)
    disp(' ')
    et=abs(I-ITS);
    fprintf('FehlerTS= %f',et)
    disp(' ')  

end

function y=SNCFf(x)
syms y
y= @(x) log(x-y);
end
 


SNCFf ist unten definiert..in den letzten 4 Zeilen.
Nun habe ich zwar weniger Fehlermeldungen, aber immernoch ein paar Zeilen:
Zitat:
Undefined function 'isfinite' for input arguments of type 'sym'.

Error in quad (line 79)
if ~isfinite(y(1))

Error in sumTrap (line 12)
I=quad(y,a,b);


Also es besteht wahrscheinlich vor allem noch ein Problem mit dem 'y' in der Funktionsdefinition (SNCFf).Oder ist das ok gelöst, wenn ich einfach 'sym y' mache?
Dann besteht nach wie vor ein Problem mit quad..obwohl ich noch nicht genau sehe, was dort falsch sein sollte...

Danke für die Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 02.05.2012, 15:20     Titel:
  Antworten mit Zitat      
Hallo,

was mich hier ein wenig wundert, ist, dass zwar die Trapezregel angewandt werden soll, aber die Ableitung auftaucht. Warum das? Warum wird überdies von einer optimalen Schrittweite gesprochen, ohne eine Fehlerschranke, welche unterschritten werden soll, anzugeben?!

Grüße, MaFam
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 02.05.2012, 15:45     Titel:
  Antworten mit Zitat      
Schau mal hier: http://www.wolframalpha.com/input/?.....%28x-y%29%2Cy%2C0%2C1%29+

Das zeigt sofort, dass der Definitionsbereich von F(x) keinen Sinn macht, wenn das Integral nicht auf der komplexen Ebene betrachtet werden soll.

Edit: Entweder ist F(x) = integral_0^1(log(x+y),y) (beachte das "+"!!!) oder es geht hier um komplexe Differenzierbarkeit, was ich allerdings nicht glaube.
Private Nachricht senden Benutzer-Profile anzeigen
 
MarcelF6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 18.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2012, 19:06     Titel:
  Antworten mit Zitat      
Hallo MaFam

Ich habs nochmals überprüft - es steht genau so auf meinem Blatt. Wenn die Homepage wieder up ist, kann ich dir den Link zur Aufgabe schicken.
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 02.05.2012, 19:13     Titel:
  Antworten mit Zitat      
Siehst du denn selbst die Problematik? Hattet ihr schon Vorlesungen zu komplexen Zahlen?
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 03.05.2012, 14:08     Titel:
  Antworten mit Zitat      
So, mein Einwand war unberechtigt. Der Integrand ist tatsächlich nach den ganzen Voraussetzungen immer reell, daher existiert das Riemann-Integral wie gewohnt (im Reellen).

Ich würde damit starten, F_n(x) aufzustellen. Wie sieht dies aus?

Edit: Ich gehe dann mit dir systematisch durch die Aufgabe...
Private Nachricht senden Benutzer-Profile anzeigen
 
MarcelF6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 18.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2012, 16:24     Titel:
  Antworten mit Zitat      
Edit: Hihi guuut Smile

F_n ist ITS im Code, das heisst:
F_n = sum(h/2*(f(x_(i-1) + f(x_i)), i, 0, n)

Nun soll ja eben ein "optimales" h = 1/n gefunden werden, sodass der Unterschied des angegebenen F'(x) und des "genauen" F'(x) minimal wird. Wie gesagt: Ich probierte, das alles in Matlab zu implementieren (siehe letzter Code) und dann zu testen, für welches h dies der Fall ist. Da der Code aber irgendwo noch einen Fehler hat, stecke ich im Moment hier fest...
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 04.05.2012, 11:48     Titel:
  Antworten mit Zitat      
OK, sei also F_n= \sum\limits_{i=1}^n \frac{h}{2}*(f(x_{i-1}) + f(x_i)) und es sei h=\frac{1}{n}.
Nun würde ich gerne zunächst klären, bevor du per Programm verifizieren willst, welche Optimierungsaufgabe tatsächlich dahinter steckt.

Du schreibst: "Nun soll ja eben ein "optimales" h = 1/n gefunden werden, sodass der Unterschied des angegebenen F'(x) und des "genauen" F'(x) minimal wird."

Kannst du das bitte einmal als formale Aussage formulieren?! Dass das korrekt aufgestellt wird, ist wesentlich für diese Aufgabe. Programmieren kommt zum Schluss. Das ist aber keine große Sache, wenn das math. Fundament steht...

Grüße, MaFam
Private Nachricht senden Benutzer-Profile anzeigen
 
MarcelF6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 18.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2012, 14:19     Titel:
  Antworten mit Zitat      
Also, hierzu haben wir heute definiert:
h_opt = C_1 * delta^(1/3) mit C_1 = (2 C_f)^(-1/3)

Das kam wie folgt zustande:
Sei f_s = f + #f. (d.h. die Funktion f liegt in gestörter Form vor. (#sollte ein Dreieck sein))

Dann haben wir: f'(x_0) = ((f_s(x_1) - f_s(x_-1))/2h) = ((f_1 - f_-1 + #f(x_1) - #f(x_-1))/2h) = f'(x_0) - e_2'(x_0) + ((#f(x_1)-#f(x_-1))/2h)

|f'(x_0) - ((f_s(x_1) - f_s(x_-1))/2h) | <= |e_2'(x_0) | + (|#f(x_1)| + |#f(x_-1)|)/(2h)

Das |e_2'(x_0)| wird nun definiert als C_f*h^2.

für h --> 0 gilt: |f'(x_0) - ((f_s(x_1)-f_s(x_-1))/2h)| <= |e_2'(x_0)| + (||#f||/h) --> oo.

Sei delta = ||#f||_max
dann: ... <= C_f*h^2 + delta/h = E(h).

...und durch Ableiten von E(h) erhält man dann eben die optimale Schrittweite h_opt = C_f * delta^(1/3). [der Faktor spiele nicht so eine grosse Rolle. In der Vorlesung haben wir die Version hier unten gemacht, im Skript steht jene der zweiten Zeile).

Ja...also haben wir im Grunde die optimale Schrittweite. Nur habe ich noch keine Idee gehabt, wie ich meine Implementation abändern soll.

Danke für jede Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 05.05.2012, 21:26     Titel:
  Antworten mit Zitat      
Oh, das hab ich da übersehen Embarassed

Aber lies dir nochmal die Matlabhilfe zu quad durch. Mit Symbolischen Variablen macht das aus meiner Sicht wenig Sinn.

Also eher nur so
Code:

quad(@SNCFf,...)
...
function y=SNCFf(x)
y= (x) * log(x-y);
end


In welchen Grenzen willst du denn die Simpsonquadratur machen?
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 07.05.2012, 10:48     Titel:
  Antworten mit Zitat      
Hallo,

bevor ich mich weiter damit beschäftige, ist das Thema für dich erledigt?

Grüße, MaFam
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.