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

Integral von inline-Funktion

 

lupula91
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 07.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2014, 09:59     Titel: Integral von inline-Funktion
  Antworten mit Zitat      
Hallo zusammen,

ich bin noch recht neu mit Matlab, aber wir müssen in Numerik II nun einiges Programmieren...
Es fängt im Moment mit einem Programm an, das Trapez- und Simpsonregel zu Integration benutzt und außerdem den Fehler zum analytischen Integral berechnet.
Da es mit beliebigen Funktionen funktionieren soll, muss ich ja die Funktion als inline-Eingabe definieren. Nun soll aber von genau dieser Funktion dann auch nochmal das genaue Integral berechnet werden... Wie kriege ich das hin? Bisher habe ich es mit int und mit quad versucht, aber jedesmal kommen Fehlermeldungen, die mit meinem eigentlichen Programm nichts zutun haben...

Mein Programm sieht bisher so aus: (nach der Berechnung des genauen Integrals habe ich noch einiges auskommentiert, was später wieder rein soll, aber das wird eh frühstens dann funktionieren, wenn das Integral auch berechnet wird...)

Code:

function Tabelle()

F=inline(input('Geben Sie die Funktion ein: ', 's'));
a=input('Geben Sie die Untergrenze des Integrals ein: ');
b=input('Geben Sie die Obergrenze des Integrals ein: ');
n=input('Geben Sie die Anzahl der Abschnitte ein: ');



    h=(b-a)/n;
    xS=a:h:b;
    nS=n+1;
   
    for i=1:nS
    yS(i)=F(xS(i));
    end
   
T1=yS(1);
Tn=yS(nS);
Tsum=sum(yS(2:n));
Trapez=h*(T1/2+Tsum+Tn/2);


%Simpsonregel
I=(yS(1)+yS(nS)); % Erster und letzter Wert der Simpsonformel
faktor=4;
for i=2:n
I=I+yS(i)*faktor;% Schleife für den Vorfaktor und der mittleren Terme
%plus die die äußeren
if (faktor ==4)
faktor=2;
else
faktor=4;
end;
end
Simpson=I*h/3; %Berechnung der Simpsonformel

syms x ;
exW=quad(x,a,b); % Berechnung des analytischen Integrals
% TrapezFehler= eval(exW-Trapez) %Fehlerberechnung exater Wert minus
% %numerischer Wert
% SimpsonFehler= eval(exW-Simpson) %Fehlerberechnung exater Wert minus
% %numerischer Wert


fprintf('\n');
fprintf('Der exakte numerische Wert des Integrals ist: ')
fprintf('\n');
disp(num2str(exW))

fprintf('\n');
fprintf('\n');
fprintf('Die Trapezregel liefert folgende Näherung für die Abschnittsanzahl ')
fprintf(num2str(n))
fprintf('\n');
fprintf('\n');
disp(num2str(Trapez, 5))

fprintf('\n');
fprintf('Die Simpsonregel liefert folgende Näherung für die Abschnittsanzahl ')
fprintf(num2str(n))
fprintf('\n');
fprintf('\n');
disp(num2str(Simpson, 5))
end
 


und die Fehlermeldung ist folgende:

??? Error using ==> fcnchk at 108
If FUN is a MATLAB object, it must have an feval method.

Error in ==> quad at 66
f = fcnchk(funfcn);

Error in ==> Tabelle at 39
exW=quad(x,a,b); % Berechnung des analytischen Integrals


Ich hoffe, ihr könnt mir helfen... Da ich bisher mit Matlab eigentlich nichts gemacht habe, wusste ich auch nicht wirklich, nach was ich evtl in der Suche suchen soll...

Gruß
Regina
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: 07.05.2014, 10:16     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Da es mit beliebigen Funktionen funktionieren soll, muss ich ja die Funktion als inline-Eingabe definieren.

Nein. inline ist veraltet, und man sollte Function Handles verwenden.

Code:
f = @(x) x.^2;
integral(f, 0, 1)


Wenn die Eingabe unbedingt als String erfolgen soll, dann so:
Code:
fun = 'x.^2';
f = str2func(['@(x)' fun]);
integral(f, 0, 1)


Ich würde die input-Befehle vermeiden und stattdessen den Nutzer die Informationen als Eingabeargumente übergeben lassen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 07.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2014, 10:34     Titel:
  Antworten mit Zitat      
Man merkt, auf welchem Stand unsere Professoren sind Wink Uns wurde nämlich gesagt, dass das mit inline gemacht werden muss...

Naja, dann werde ich mir das Handles mal anschauen... Shocked

Und das andere muss ich mir jetzt auch erstmal anschauen... stehe da noch ein bisschen auf dem Schlauch...
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: 07.05.2014, 11:38     Titel:
  Antworten mit Zitat      
Hallo,

In
Code:

steht:
Zitat:
inline will be removed in a future release. Use Anonymous Functions instead.


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

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 07.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2014, 14:16     Titel:
  Antworten mit Zitat      
So, ich nochmal... Mein ersten Programm mit Trapez- und Simpsonregel läuft nun...
Jetzt kommt das nächste mit der Romberg-Integration (und dann noch die Gauss Quadratur)

Bei den beiden noch fehlenden Programmen, habe ich nun die Eingabe der Funktion genauso gemacht wie bei dem ersten Programm (letztlich doch mit inline, da ich beim anderen nicht durchblicke und die Profs das ja anscheinend auch so wollen)... Allerdings läuft es nun bei den beiden neuen Programmen nicht und ich kapiere nicht warum...
Vielleicht könnt ihr mir nochmal helfen, wo das Problem liegt...
Ich schreib euch mal die Codes...

Trapez- und Simpsonregel: (das ist das, was nun problemlos funktioniert!)

Code:

function Tabelle()
syms x;
F=inline(input('Geben Sie die Funktion ein: '));
a=input('Geben Sie die Untergrenze a des Integrals ein: ');
b=input('Geben Sie die Obergrenze b des Integrals ein: ');
n=input('Geben Sie die Anzahl der Abschnitte ein: ');



    h=(b-a)/n;
    xS=a:h:b;
    nS=n+1;
   
    for i=1:nS
    yS(i)=F(xS(i));
    end
   
T1=yS(1);
Tn=yS(nS);
Tsum=sum(yS(2:n));
Trapez=h*(T1/2+Tsum+Tn/2);


%Simpsonregel
I=(yS(1)+yS(nS)); % Erster und letzter Wert der Simpsonformel
faktor=4;
for i=2:n
I=I+yS(i)*faktor; % Schleife für den Vorfaktor und der mittleren Terme plus die die äußeren
if (faktor ==4)
faktor=2;
else
faktor=4;
end;
end
Simpson=I*h/3; %Berechnung der Simpsonformel


exakt = quad (F , a , b);
TrapezFehler= exakt-Trapez; %Fehlerberechnung exater Wert minus numerischer Wert
SimpsonFehler= exakt-Simpson; %Fehlerberechnung exater Wert minus numerischer Wert


fprintf('\n');
fprintf('Der exakte numerische Wert des Integrals ist: ')
fprintf('\n');
disp(num2str(exakt))

fprintf('\n');
fprintf('\n');
fprintf('Die Trapezregel liefert folgende Näherung für die Abschnittsanzahl ')
fprintf(num2str(n))
fprintf('\n');
fprintf('\n');
disp(num2str(Trapez, 5))

fprintf('\n');
fprintf('\n');
fprintf('Der Fehler der Trapezregel ist: ')
disp(num2str(TrapezFehler, 5))
fprintf('\n');
fprintf('\n');

fprintf('\n');
fprintf('Die Simpsonregel liefert folgende Näherung für die Abschnittsanzahl ')
fprintf(num2str(n))
fprintf('\n');
fprintf('\n');
disp(num2str(Simpson, 5))

fprintf('\n');
fprintf('\n');
fprintf('Der Fehler der Simpsonregel ist: ')
disp(num2str(SimpsonFehler, 5))
fprintf('\n');
fprintf('\n');

end
 



Romberg-Integration: (läuft nicht!)

Code:

function Romberg()
%format long g % mehr nachkommastellen
syms x;
F=inline(input('Geben Sie die Funktion ein: '));
a=input('Geben Sie die Untergrenze a des Integrals ein: ');
b=input('Geben Sie die Obergrenze b des Integrals ein: ');
n=input('Geben Sie die Anzahl der Abschnitte ein: ');

exakt = quad (F , a , b); % Analytischer Integralwert

for k = 1 : n %k lähft von 1 bis Knoten eingabe
h = (b-a)/(2^(k-1)); % k-1, da Matlab keine Null annimmt als Index
T(k,1) = h * (subs(F,a)/2 + subs(F,b)/2); %Bestimmung des ersten und
%letzten Werts der Rombergformel

for j = a+h : h : b-h %Bestimmung der restlichen Werte wegen
%Verschiebung von h
T(k,1) = T(k,1) + h * subs(f,j); % Zusammensetzung des ersten/letzten Werte + die in der Mitte,also T(k,0)
end
end
for i= 2 : n % hintere Laufvariable
for k = 1 : n-i+1 % vordere Laufvariable
T(k,i) = (T(k+1,i-1) - ((1/(4^i)) * T(k,i-1)))/(1-(1/4^i)); %Formel
end
end
T
TFehler=abs(exakt-T(1,n)) %Fehler von exakten und berechnetem Wert
end
 



und Gauss-Quadratur: (läuft auch nicht!)

Code:

function y=gauss()
syms 'x';
y=inline(input('Geben Sie die Funktion ein: ', 's'));
a=input('Geben Sie die Untergrenze a des Integrals ein: ');
b=input('Geben Sie die Obergrenze b des Integrals ein: ');
n=input('Geben Sie die Anzahl der Abschnitte ein: ');

X=[0, 0, 0, 0, 0, 0, 0, 0;
0.5773502691896257645091488, -0.5773502691896257645091488, 0, 0, 0, 0, 0, 0;
0.7745966692414833770358531, 0, -0.7745966692414833770358531, 0, 0, 0, 0, 0;
0.8611363115940525752239465, 0.3399810435848562648026658, -0.3399810435848562648026658, -0.8611363115940525752239465, 0, 0, 0, 0;
0.9061798459386639927976269, 0.5384693101056830910363144, 0, -0.5384693101056830910363144, -0.9061798459386639927976269, 0, 0, 0;
0.9324695142031520278123016, 0.6612093864662645136613996,0.2386191860831969086305017, -0.2386191860831969086305017, -0.6612093864662645136613996, -0.9324695142031520278123016, 0, 0;
0.9491079123427585245261897, 0.7415311855993944398638648, 0.4058451513773971669066064, 0, -0.4058451513773971669066064, -0.7415311855993944398638648, -0.9491079123427585245261897, 0;
0.9602898564975362316835609, 0.7966664774136267395915539, 0.5255324099163289858177390, 0.1834346424956498049394761, -0.1834346424956498049394761, -0.5255324099163289858177390, -0.7966664774136267395915539, -0.9602898564975362316835609];
% Matrix der Werte von x(i) für Gauß-Quadratur

W=[0 0 0 0 0 0 0 0;
1.0000000000000000000000000, 1.0000000000000000000000000, 0, 0, 0, 0, 0, 0;
0.5555555555555555555555556, 0.8888888888888888888888889, 0.5555555555555555555555556, 0, 0, 0, 0, 0;
0.3478548451374538573730639, 0.6521451548625461426269361, 0.6521451548625461426269361, 0.3478548451374538573730639, 0, 0, 0, 0;
0.2369268850561890875142640, 0.4786286704993664680412915, 0.5688888888888888888888889, 0.4786286704993664680412915, 0.2369268850561890875142640, 0, 0, 0;
0.1713244923791703450402961, 0.3607615730481386075698335, 0.4679139345726910473898703, 0.4679139345726910473898703, 0.3607615730481386075698335, 0.1713244923791703450402961, 0, 0;
0.1294849661688696932706114, 0.2797053914892766679014678, 0.3818300505051189449503698, 0.4179591836734693877551020, 0.3818300505051189449503698, 0.2797053914892766679014678, 0.1294849661688696932706114, 0;
0.1012285362903762591525314, 0.2223810344533744705443560, 0.3137066458778872873379622, 0.3626837833783619829651504, 0.3626837833783619829651504, 0.3137066458778872873379622, 0.2223810344533744705443560, 0.1012285362903762591525314];
% Matrix der Werte von w(i) für Gauß-Quadratur

j=n; %Zeile gleich n (Knoten)
sum=0;
for i=1:n % Zeile läuft bis nten Stützpunkt

sum=sum+W(j,i)*y((b-a)*X(j,i)/2+(a+b)/2); % Formel nur der Summe
end
y=((b-a)/2)*sum; % Formelzusammensetzung von sum mal h
syms 'x';
exakt = quad (y , a , b); % Berechnung des analytischen Integrals
yFehler = (exakt - y );%Fehlerberechnung exater Wert minus numerischer Wert

disp(num2str(yFehler))
end
 



Ich hatte mich so gefreut, als das erste Programm lief, weil ich dachte, dass ich dann einfach nur noch die Teile kopieren muss (und gegenenfalls die Variablennamen ändern) aber so einfach wars dann leider doch nicht... Sad

Gruß
Regina
Private Nachricht senden Benutzer-Profile anzeigen
 
lupula91
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 07.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2014, 14:21     Titel:
  Antworten mit Zitat      
Achso meine Fehlermeldungen:

Bei der Romberg-Integration:

Zitat:
??? Error using ==> sym.sym>tomupad at 2162
Conversion to 'sym' from 'inline' is not possible.

Error in ==> sym.sym>sym.sym at 102
S.s = tomupad(x,'');

Error in ==> subs at 60
r = subs(sym(f),varargin{:});

Error in ==> Romberg at 13
T(k,1) = h * (subs(F,a)/2 + subs(F,b)/2); % Bestimmung des ersten und letzten Werts der
Rombergformel


Und bei der Gauss-Quadratur:

Zitat:
??? Error using ==> fcnchk at 108
FUN must be a function, a valid string expression, or an inline function object.

Error in ==> quad at 66
f = fcnchk(funfcn);

Error in ==> gauss at 36
exakt = quad (y , a , b); % Berechnung des analytischen Integrals
Private Nachricht senden Benutzer-Profile anzeigen
 
lupula91
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 07.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2014, 16:39     Titel:
  Antworten mit Zitat      
Jetzt macht mich Matlab total wahnsinnig...

Habe es jetzt nochmal mit @(x) statt inline versucht... Das erste Programm läuft auch soweit, abgesehen davon, dass er mich jetzt 6x nach der Eingabe der Funktion fragt...!?!?!?! Das kann doch nicht sein??
Wenn ich es nicht abgeben müsste nächste Woche, würde ich den Kram einfach hinwerfen... Evil or Very Mad
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: 07.05.2014, 17:33     Titel:
  Antworten mit Zitat      
Hallo,

stelle bitte den aktuellen Code zur Verfügung, in dem das Problem (6malige Eingabe) ersichtlich ist.

Der Debugger kann dir helfen selbst herauszufinden, wann die Eingabe angefordert wird. Vielleicht ist der input-Befehl in eine Schleife geraten?

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

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 07.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2014, 09:02     Titel:
  Antworten mit Zitat      
Code:

function Tabelle()
% syms x;
F=(@(x)(input('Geben Sie die Funktion ein: ')));
a=input('Geben Sie die Untergrenze a des Integrals ein: ');
b=input('Geben Sie die Obergrenze b des Integrals ein: ');
n=input('Geben Sie die Anzahl der Abschnitte ein: ');



    h=(b-a)/n;
    xS=a:h:b;
    nS=n+1;
   
    for i=1:nS
    yS(i)=F(xS(i));
    end
   
T1=yS(1);
Tn=yS(nS);
Tsum=sum(yS(2:n));
Trapez=h*(T1/2+Tsum+Tn/2);


%Simpsonregel
I=(yS(1)+yS(nS)); % Erster und letzter Wert der Simpsonformel
faktor=4;
for i=2:n
I=I+yS(i)*faktor; % Schleife für den Vorfaktor und der mittleren Terme plus die die äußeren
if (faktor ==4)
faktor=2;
else
faktor=4;
end;
end
Simpson=I*h/3; %Berechnung der Simpsonformel


exakt = integral (F , a , b);
TrapezFehler= exakt-Trapez; %Fehlerberechnung exater Wert minus numerischer Wert
SimpsonFehler= exakt-Simpson; %Fehlerberechnung exater Wert minus numerischer Wert


fprintf('\n');
fprintf('Der exakte numerische Wert des Integrals ist: ')
fprintf('\n');
disp(num2str(exakt))

fprintf('\n');
fprintf('\n');
fprintf('Die Trapezregel liefert folgende Näherung für die Abschnittsanzahl ')
fprintf(num2str(n))
fprintf('\n');
fprintf('\n');
disp(num2str(Trapez, 5))

fprintf('\n');
fprintf('\n');
fprintf('Der Fehler der Trapezregel ist: ')
disp(num2str(TrapezFehler, 5))
fprintf('\n');
fprintf('\n');

fprintf('\n');
fprintf('Die Simpsonregel liefert folgende Näherung für die Abschnittsanzahl ')
fprintf(num2str(n))
fprintf('\n');
fprintf('\n');
disp(num2str(Simpson, 5))

fprintf('\n');
fprintf('\n');
fprintf('Der Fehler der Simpsonregel ist: ')
disp(num2str(SimpsonFehler, 5))
fprintf('\n');
fprintf('\n');

end
 


Das ist mein aktueller Programmcode. Die Eingabe soll ganz am Anfang verlangt werden, weshalb jegliche Eingaben auch vor irgendwelchen anderen Funktionen und Schleifen etc stehen... Daran kann es, meiner Meinung nach, also nicht liegen. Wahrscheinlich verstehe ich den Handles Befehl einfach nicht, habe bisher aber noch keine Erklärung gefunden, die mir wirklich geholfen hat.


Gruß
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.05.2014, 14:30     Titel:
  Antworten mit Zitat      
Hallo,

da sind wir nochmal am Anfang:

Code:
fun = input('Geben Sie die Funktion ein: ', 's');
f = str2func(['@(x)' fun]);

statt deiner Variante der Funktionseingabe.

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