Verfasst am: 18.01.2008, 23:18
Titel: Nullstellen Mit Newton Verfahren Und Grafische Darstellung
hallo leute, ich brauche ihre tipp bzw. ansätze für folgender problem stellung
Ziel:
- Programierung von Newton und Steffenson Verfahren um Nullstellen zu bestimmen (Kein Problem, die bekomme hin)
- funktion eingabe soll über gui Fenster geschehen(kein idee)
- pop up menü zum verfahren auswahl(kein problem)
- berechnung der einzelne interetionen wahlweise endweder ununterberechung(also durchgehend bis ein abbruch bedinnung erfüllt wird) oder schrittweise(kein idee)
- dass alles als gui fenster ausgegeben bzw. steuerbar
könnt jemand mir einige gute links bzw. ansätze geben wie ich es lösen kann.
mein bisherige quell code sieht so so aus, also ist nicht viel aber wird noch gemacht
Hallo,
ich nehme an, dass du diese GUI nicht mit guide erstellt hast??
Jedenfalls deutet dein Quellcode darauf hin.
Natürlich kann man das auch so machen, aber mtitels guide erscheint
mir das ganze etwas einfacher!? Dann ist der quellcode für die Buttons schon da, und man muss nur noch die Berechnungen einfügen.
Aber das ist ansichtssache.
zur Funktionseingabe:
Man muss dazu in die GUI ein Edit Fenster einfügen, wo man
die Funktion rein eingibt. dann kann man im Programmcode diesen einlesen z.B. so:
f_str=get(handles.edit1,'String');
f_1=char(f_str);
f=inline(f_1,'x')
wobei edit1 der jeweilige Tag name ist des edit fensters.
Ob die char Umwandlung zwischendurch notwendig ist, musst
du mal ausprobieren. Da ich ein ähnliches Programm zur Zeit erstelle (allderdings zum Thema Interpolation) weiß ich erfahrungsgemäß, dass
es an dieser Stelle Probleme geben könnte, wenn man char weglässt . (warum auch immer!?)
Berchnung der einzelnen Iterationen:
Könnte man mit Radio-Buttons als Auswahl in die GUI einfügen und
dann im Programmcode mittels if-Schleife umsetzen.
Hoffe ich konnte dir wenigstens ein bisschen weiterhelfen.
Viele Grüße
Henner
danke für nette ansatz, es hat mir weiter geholfen, nun kann ich irgend welche funktion in der text feld eingeben und übernehmen, aber lange bin ich nicht fertig, alles nach und nach. zur zeit sieht mein code so aus.
Code:
% Autor : Halil Aslan % Program Name : Nullstellen Verfahren % Erstellungs Datum : 20.01.2008 % Program Funktion : Berechnet Nullstellen und Plotet Eingegebene Funktion % Datei Große : ca. 5 KB
%% *************** Einstellungen Für Grafik Fenster *********************
hi habs noch einer frage, sorry das ich nerve aber ich komme damit nicht klar, wie kann ich aber nun startwert in das funktion eingeben, hab so versucht, zwar wird der wert gelesen, aber wird nicht in funktion übergeben.
Hallo,
hier nervt keiner, dafür ist das Forum ja da, um bei solchen Problemen zu helfen.
normalerweise wird die Funktion mit Startwert so aufgerufen z.B:
wenn startwert x=2 ist , dann :
y=f(x)
Dabei wird diese Zahl 2 an die Funkion übergeben und an dieser Stelle ausgewertet.
wenn x ein Vektor ist,ist natürlich y auch ein Vektor, der die Funkionswerte von x enthält.
das mit der eingabe der funktion und werte bereiche klappt aber irgend wie wenn ich nun aus dem pop up menu newton verfahren auswähle und mit callback aufrufe erkennt funtion f, dass ich in dem grafik_funktion einlese nicht?
Zuletzt bearbeitet von asimanca am 09.02.2008, 15:16, insgesamt 2-mal bearbeitet
das mit der eingabe der funktion und werte bereiche klappt aber irgend wie wenn ich nun aus dem pop up menu newton verfahren auswähle und mit callback aufrufe erkennt funtion f, dass ich in dem grafik_funktion einlese nicht?
Hast eventuell ein idee wieso es nicht geht?
Hallo,
ich versteh leider deine Frage nicht ganz, aber wenn du die Funktion
grafik_funktion aufrufen willst, sollte das etwa so passieren:
dadurch wird der m.File aufgerufen der Grafikfunktion
mit den werten, die in eth1 und eth2 eingegeben wurde.
Alternativ müsste es auch so funktioneren:
weil die eth_1 und eth_2 werden ja durch den Funktionsaufruf übergeben.
Also müsste das so funktionieren.
So hoffe dass ich jetzt alles richtig geändert habe.
Gruß
Henner
hallo leute ich habe mein projekt einiger masse aufgebaut und fuctionen in verschiedene m file erstellt, aber wenn ich die eweilige funktionen in einer m file haben will, klappt dann nicht.
Hier Projekt.m file
Code:
%% *************** Einstellungen Für Grafik Fenster ********************* clc clearall closeall
%% Erstelle GUI und Mach Es Unsichtbar Bis Aufgebaut Wird
FIGUR = figure('Visible','off','Position',[760,700,750,500]);
%% Ab Hier Erstellung und Einstellungen Von Komponenten
FUNKTION_Text = uicontrol('Style','text',...
'Position',[135,470,100,17],...
'String','FUNKTION {f(x)}',...
'BackgroundColor',['red']);
%% Ab Hier Einstellungen Für Menu
MENUE_Text = uicontrol('Style','text',...
'Position',[10,470,105,17],...
'String','Verfahren Auswahl',...
'BackgroundColor',['red']);
%% Ab Hier Einstellungen Für Komponente Zum Normalisieren set([FIGUR,ACHSE,FUNKTION_Text,FUNKTION,BEREICH_Text,BEREICH,STARTWERT_Text,STARTWERT,INTERATIONEN_Text,INTERATIONEN,SCHLIESS_BT,PLOT_BT,MENUE_Text,MENUE_Wahl,EPSILON_Text,EPSILON],...
'Units','normalized');
%% Ab Hier Überschrift Von Figur(Fenster) set(FIGUR,'Name','Nullstellen Verfahren')
%% Platziert GUI In Der Mitte Der Fenster
movegui(FIGUR,'center')
%% Macht GUI Sichtbar set(FIGUR,'Visible','on');
format long %Länge Der Ausgabe Format
funktion=get(FUNKTION,'String'); %Input Von Funktion
startwert=get(STARTWERT,'String'); %Input Von Startwert
interation=get(INTERATIONEN,'String'); %Input Von Anzahl Der Interation
f_funktion=char(funktion);
x_start=eval(startwert);
nmax=eval(interation);
f = inline(f_funktion,'x');
xn = x_start; %Intialisierung Der Variable xn mit wert x_start
xsol = x_start; %Intialisierung Der Variable xsol mit wert x_start
n = nmax; %Intialisierung Der Variable n mit wert nmax
tolx = 1e-5; %Intialisierung Der Variable tolx
tolf = 1e-5; %Intialisierung Der Variable tolf
h = 1e-5; %Schrittweite fuer Differenzenquotient
f1 = feval(f,xn); %Berechnung Der Funktion Wert bzgl. Startwert
for k=1:nmax %For Schleife vok k=1 bis Variable Wert nmax
f2 = feval(f,xn+h); %Berechnung Der Funktion Wert bzgl. Startwert + Schrittweite fuer Differenzenquotient
xsol = xn-h*f1/(f2-f1); %Berechnung Der Neue Startwert
deltax = abs(xsol-xn);
fsol = feval(f,xsol);
deltaf = abs(fsol);
%------- Speichern der Iteration -------
x_out(k) = xsol;
%---------------------------------------
if(deltax<tolx) | (deltaf<tolf) %Abbruch Bedinnung Für Interationen
n = k; %Geforderte Genauigkeit vorzeitig erreicht
break;
end;
xn = xsol; %Ausgabe Der Letzte Interation Ergebnis
f1 = fsol; %Nächste Funktion Ergebnis
%plot(x_out(k),f(x_out(k)),'x')% ein x plotten end;
function[x,x_out]=steffenson(FUNKTION,STARTWERT,INTERATIONEN,EPSILON)
funktion=get(FUNKTION,'String'); %Input Von Funktion
startwert=get(STARTWERT,'String'); %Input Von Startwert
interation=get(INTERATIONEN,'String'); %Input Von Anzahl Der Interation
epsilon=get(EPSILON,'String'); %Input Von epsilon
format long %Länge Der Ausgabe Format eps=eps_tol; %Intialisierung Von Variable eps mit wert eps_tol
n=nmax; %Intialisierung Von Variable n mit wert namx
x=x_start; %Intialisierung Von Variable x mit wert x_start
i=1; %Intialisierung Von Variable i(Zähler Für Interationen)
whileabs(f(x)) > eps; %While Schleife Bis Erfüllt Wird
ifabs(f(x)) < eps | i > n; %Abbruch Bedinnung Für Interationen
disp('Nullstelle Bei');
break;
end;
x=x-(f(x)/((f(x+f(x))-f(x))/f(x))); %Berechnung Von Der x werte
x_out(i) = x; %Ausgabe Von Einzelner Interationen
i=i+1; %Erhöhe Zähler Bei Jeder Durchlauf
end;
val = get(MENUE_Wahl,'Value');
if val == 1
'Callback', '{@newton,FUNKTION,STARTWERT,INTERATIONEN}'
elseif val == 2
'Callback', '{@steffenson,FUNKTION,STARTWERT,INTERATIONEN,EPSILON}'
end
so ich bin einstück weiter aber immer noch nicht ganz fertig.
so sieht mein gui aus
Code:
%% *************** Einstellungen Für Grafik Fenster ********************* clc clearall closeall
%% Erstelle GUI und Mach Es Unsichtbar Bis Aufgebaut Wird
FIGUR = figure('Visible','off','Position',[760,700,750,500]);
%% Ab Hier Erstellung und Einstellungen Von Komponenten
FUNKTION_Text = uicontrol('Style','text',...
'Position',[135,470,100,17],...
'String','FUNKTION {f(x)}',...
'BackgroundColor',['red']);
%% Ab Hier Einstellungen Für Menu
MENUE_Text = uicontrol('Style','text',...
'Position',[10,470,105,17],...
'String','Verfahren Auswahl',...
'BackgroundColor',['red']);
%% Ab Hier Einstellungen Für Komponente Zum Normalisieren set([FIGUR,ACHSE,FUNKTION_Text,FUNKTION,BEREICH_Text,BEREICH,STARTWERT_Text,STARTWERT,INTERATIONEN_Text,INTERATIONEN,SCHLIESS_BT,PLOT_BT,MENUE_Text,MENUE_Wahl],...
'Units','normalized');
%% Ab Hier Überschrift Von Figur(Fenster) set(FIGUR,'Name','Nullstellen Verfahren')
%% Platziert GUI In Der Mitte Der Fenster
movegui(FIGUR,'center')
%% Macht GUI Sichtbar set(FIGUR,'Visible','on');
format long %Länge Der Ausgabe Format
funktion=get(FUNKTION,'String'); %Input Von Funktion
startwert=get(STARTWERT,'String'); %Input Von Startwert
interation=get(INTERATIONEN,'String'); %Input Von Anzahl Der Interation
f_funktion=char(funktion);
x_start=eval(startwert);
nmax=eval(interation);
f = inline(f_funktion,'x');
xn = x_start; %Intialisierung Der Variable xn mit wert x_start
xsol = x_start; %Intialisierung Der Variable xsol mit wert x_start
n = nmax; %Intialisierung Der Variable n mit wert nmax
tolx = 1e-5; %Intialisierung Der Variable tolx
tolf = 1e-5; %Intialisierung Der Variable tolf
h = 1e-5; %Schrittweite fuer Differenzenquotient
f1 = feval(f,xn); %Berechnung Der Funktion Wert bzgl. Startwert
for k=1:nmax %For Schleife vok k=1 bis Variable Wert nmax
f2 = feval(f,xn+h); %Berechnung Der Funktion Wert bzgl. Startwert + Schrittweite fuer Differenzenquotient
xsol = xn-h*f1/(f2-f1); %Berechnung Der Neue Startwert
deltax = abs(xsol-xn);
fsol = feval(f,xsol);
deltaf = abs(fsol);
%------- Speichern der Iteration -------
x_out(k) = xsol;
%---------------------------------------
if(deltax<tolx) | (deltaf<tolf) %Abbruch Bedinnung Für Interationen
n = k; %Geforderte Genauigkeit vorzeitig erreicht
break;
end;
xn = xsol; %Ausgabe Der Letzte Interation Ergebnis
f1 = fsol; %Nächste Funktion Ergebnis
end;
funktion=get(FUNKTION,'String'); %Input Von Funktion
startwert=get(STARTWERT,'String'); %Input Von Startwert
interation=get(INTERATIONEN,'String'); %Input Von Anzahl Der Interation
format long %Länge Der Ausgabe Format eps=1e-5;; %Intialisierung Von Variable eps mit wert eps_tol
n=nmax; %Intialisierung Von Variable n mit wert namx
x=x_start; %Intialisierung Von Variable x mit wert x_start
i=1; %Intialisierung Von Variable i(Zähler Für Interationen)
whileabs(f(x)) > eps; %While Schleife Bis Erfüllt Wird
ifabs(f(x)) < eps | i > n; %Abbruch Bedinnung Für Interationen
disp('Nullstelle Bei');
break;
end;
x=x-(f(x)/((f(x+f(x))-f(x))/f(x))); %Berechnung Von Der x werte
x_out(i) = x; %Ausgabe Von Einzelner Interationen
i=i+1; %Erhöhe Zähler Bei Jeder Durchlauf
end;
val = get(MENUE_Wahl,'Value');
if val == 1 [xsol,deltax,deltaf,n,x_out]=newton(FUNKTION,STARTWERT,INTERATIONEN) elseif val == 2 [n,x,x_out]=steffenson(FUNKTION,STARTWERT,INTERATIONEN) end
Berchnung der einzelnen Iterationen: [/b]
Könnte man mit Radio-Buttons als Auswahl in die GUI einfügen und
dann im Programmcode mittels if-Schleife umsetzen.
Henner
ok erstellen von radio button ist kein problem wie lasse ich aber diese code was für animation ist als if schleife umsetzen.
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.