Verfasst am: 07.05.2014, 09:59
Titel: Integral von inline-Funktion
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...)
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: ');
%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
??? 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...
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: ');
%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
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
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: ');
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
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...
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...
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: ');
%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
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.
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
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.