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

beliebige Funktion über input eingeben und verarbeiten

 

willi_vintage
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2014, 21:43     Titel:
  Antworten mit Zitat      
weil ich versucht habe in dieser Zeit alleine das Problem zu lösen und oben genannter Code bislang dabei raus kam, der so aber nicht funktioniert. Das zugehörige Skript sieht so aus:

Code:
defaulter=1;
% while defaulter==1;
menue=input('[1] Nullstellen berechnen \n[2] Programm beenden\n');
switch menue
    case 1
        xStart=input('Startwert:');
        xEnd=input('Endwert:');
        Abstand=input('Abstand d X:');
        genauigkeit=input('Genauigkeit:');
        ErhGenauigkeit=input('erhoehte Genauigkeit?\n[1]=ja\n[0]=nein\n');
        if ErhGenauigkeit==1;
        genauigkeit=1e-05;
        x=xStart: Abstand: xEnd;
        f=F_SCHNITTPUNKTE(x, genauigkeit);
       
        elseif ErhGenauigkeit==0;
        x=xStart: Abstand: xEnd;
        f=F_SCHNITTPUNKTE(x, genauigkeit);
       
       
        end
     case 2
        exit
end      
% end
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: 12.11.2014, 21:54     Titel:
  Antworten mit Zitat      
Hallo,

und was spricht jetzt dagegen, sich mal den von mir geposteten Link anzusehen und zu schauen, wie das dort implementiert ist?

Du wirst die Funktion jedenfalls mehrfach auswerten müssen, und dazu brauchst du eben Function Handles. Z.B.

Code:
f= @(x) x.^2-4.1;
finit = f(x);

und wenn du an einem neuen x-Wert auswerten möchtest:
Code:
fneu = f(xneu);


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2014, 22:06     Titel:
  Antworten mit Zitat      
Hallo Harald,

ist ja alles nett gemeint und ich bin dir ja auch dankbar für die Hilfeleistung, nur was ist wenn man Handle nicht versteht und in dem verlinkten Beispiel nicht weiss, welche Übergabewerte nun f, a, b darstellen?
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: 12.11.2014, 22:15     Titel:
  Antworten mit Zitat      
Hallo,

dann bitte konkrete Fragen dazu stellen.

Beispielaufruf zum Link:

Code:
f = @(x) x.^2 - 4.1;
a = 2;
b = 3;
bisection(f, a, b)
 
--> sucht in [a, b] nach Nullstellen von f.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2014, 22:33     Titel:
  Antworten mit Zitat      
bei mir gibt es allerdings nur einen x-Vektor. Und dieser wird über eine Benutzerangabe festgelegt.
Code:
x= EingabeStart: EingabeSchrittweite: EingabeEnde
Also z.B.
Code:
x=[-1, 0, 1]
. Übergeben wird dann eben nur dieser Vektor
also sucht in [x] nach Nullstellen von f

und in wieweit verändert Handle die Funktion? Ich kann damit x-Werte übergeben oder wie?
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: 13.11.2014, 23:22     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
also sucht in [x] nach Nullstellen von f

Ja, und wenn es einen Vorzeichenwechsel gibt, dann willst du in dem Intervall Bisektion anwenden - und dafür könntest du dann die File Exchange- Funktion verwenden.

Zitat:
und in wieweit verändert Handle die Funktion?

Gar nicht. Das Handle verweist auf die Funktion.

Zitat:
Ich kann damit x-Werte übergeben oder wie?

Genau - siehe auch mein letzter Beitrag.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2014, 18:27     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke, das mit dem hanle klappt! Nur leider hängts nach wie vor bei deer Berechnung. Nur klappt die Berechnung immer noch nicht. Irgendwas habe ich noch nicht verstanden. bzw. generell falsch implementiert (aber was???)

Fehler:
??? Attempt to reference field of non-structure array.

Error in ==> F_SCHNITTPUNKTE at 36
if (f(xEndNeu)*f.(xEndNeu)>0)

so sieht das Skript aus:
Code:
menue=input('[1] Nullstellen berechnen \n[2] Programm beenden\n');
switch menue
    case 1
        xStart=input('Startwert:');
        xEnd=input('Endwert:');
        Abstand=input('Abstand d X:');
        genauigkeit=input('Genauigkeit:');
        ErhGenauigkeit=input('erhoehte Genauigkeit?\n[1]=ja\n[0]=nein\n');
        if ErhGenauigkeit==1;
        genauigkeit=1e-05;
        x=xStart: Abstand: xEnd;
        f=F_SCHNITTPUNKTE(x, genauigkeit);
       
        elseif ErhGenauigkeit==0;
        x=xStart: Abstand: xEnd;
        f=F_SCHNITTPUNKTE(x, genauigkeit);
       
       
        end
     case 2
        exit
end


und die dazugehörige function.m

Code:
f=@(x)0.5*x.^3-5*x.^2+2*x+10;
  finit=f(x)
        Schnittstellen=(finit(1:end-1).*finit(2:end))
        vzw=find(Schnittstellen<=0)
        xStartNeu=x(vzw)
        xEndNeu=x(vzw+1)  
        while abs(xEndNeu-xStartNeu)>=genauigkeit
            if (f(xEndNeu)*f.(xEndNeu)>0)
                xStartNeu=(xEndNeu+xStartNeu)/2
            else
                xEndNeu=(xEndNeu+xStartNeu)/2
            end    
        Nullstellen=xStartNeu
        end

        plot(x, y)
 
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: 15.11.2014, 18:56     Titel:
  Antworten mit Zitat      
Hallo,

ein Syntaxfehler - der Punkt ist an der falschen Stelle.
if (f(xEndNeu).*f(xEndNeu)>0)

Die Frage ist aber auch, ob du wirklich f(xEndNeu) mit sich selbst multiplizieren willst.
Schau dir doch den Code auf File Exchange nochmal an. Dort wird neben a und b auch der Mittelpunkt p gespeichert. Das fehlt bei dir meines Erachtens.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2014, 20:27     Titel:
  Antworten mit Zitat      
Hallo Harald,

stimmt.....Fehler ist angepasst! Immerhin rattert das Prog nun die Nullstellen runter. Aber so wirklich stimmen die Ergebnisse nicht. Erst wenn der Abstand zwischen den x-Werten sehr klein gewählt wird, stimmen die Ergebnisse. Die Rechenzeit ist dann aber viel zu groß. Also muss doch noch ein Denkfehler drin sein.
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: 15.11.2014, 21:23     Titel:
  Antworten mit Zitat      
Hallo,

ob dein Code korrekt und effizient ist, kann man nur beurteilen, wenn man ihn sieht. Ansonsten: wenn du noch Fragen hast...

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2014, 21:35     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen vielen Dank für deine Hilfe und Geduld! Der Quellcode wird noch überarbeitet werden müssen. Aber zumindest steht schonmal ein Teil. Die Berechnung vom y-Wert sollte auch noch in eine eigene function......

functionfile:


Code:
 
function [ f, Nullstellen, y] = F_SCHNITTPUNKTE(x, genauigkeit)

f=@(x)0.5*x.^3-5*x.^2+2*x+10;
%     f=@(x)2*x.^2-2;
  finit=f(x)
       
        Schnittstellen=(finit(1:end-1).*finit(2:end))
        vzw=find(Schnittstellen<=0)
        xStartNeu=x(vzw)
        xEndNeu=x(vzw+1)  
        while abs(xEndNeu-xStartNeu)>=genauigkeit
%             format long;
            if (f(xStartNeu+xEndNeu)/2.*f(xEndNeu)>0)
                xStartNeu=(xStartNeu+xEndNeu)/2
            else
                xEndNeu=(xStartNeu+xEndNeu)/2
            end    
        Nullstellen=xEndNeu
        end

        y=f(Nullstellen)


skriptfile:

Code:
defaulter=1;
% while defaulter==1;
menue=input('[1] Nullstellen berechnen \n[2] Programm beenden\n');
switch menue
    case 1
        xStart=input('Startwert:');
        xEnd=input('Endwert:');
        Abstand=input('Abstand d X:');
        genauigkeit=input('Genauigkeit:');
        ErhGenauigkeit=input('erhoehte Genauigkeit?\n[1]=ja\n[0]=nein\n');
        if ErhGenauigkeit==1;
        genauigkeit=1e-05;
        x=xStart: Abstand: xEnd;
        f=F_SCHNITTPUNKTE(x, genauigkeit);
       
        elseif ErhGenauigkeit==0;
        x=xStart: Abstand: xEnd;
        f=F_SCHNITTPUNKTE(x, genauigkeit);
       
       
        end
     case 2
        exit
end      
% end
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: 15.11.2014, 21:43     Titel:
  Antworten mit Zitat      
Hallo,

auf den ersten Blick ein Vorschlag: zusätzliche Klammern, damit am Mittelpunkt ausgewertet wird und nicht außerhalb und das dann durch 2 geteilt wird.

Code:
if (f((xStartNeu+xEndNeu)/2).*f(xEndNeu)>0)


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2014, 19:47     Titel:
  Antworten mit Zitat      
Hallo,

ist angepasst. Bei der Optimierung hängts nun allerdings wieder. Die x-Abstände müssen sehr klein gewählt werden, damit die Nullstellen einigermaßen genau sind. Optimieren möchte ich nun so, dass ein x-Vektor mit groben Abständen erstellt wird. An den gefundenen Stellen mit Vorzeichenwechsel soll ein neuer Vektor mit kleinem Intervallsabstand die Nullstellenberechnung vornehmen. Also z.B so:

grober x-Vektor:
Code:
x=xStart: Abstand: xEnd;

Mit den Werten z.B. xStart=-3
Abstand=1
xEnd=3

Anschließend werden die Stellen gesucht, an welchen ein Vorzeichnwechsel stattfindet. Nun muss doch irgendwie diese Stelle in feine Werte unterteil werden können. Also quais ein neuer Vektor
Code:
xStartNeu: Abstand_fein: xEndNeu

Der z.B. folgende Werte besitzt:
xStartNeu=-1
Abstand_fein=0.00001
xEndNeu=0

Anschließend läuft ganz normal die Intervallshalbierung durch.
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: 16.11.2014, 20:49     Titel:
  Antworten mit Zitat      
Hallo,

die Unterteilung funktioniert genau so, wie du es angegeben hast.
Ich verstehe dann wohl die Frage bzw. das Problem noch nicht.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2014, 21:33     Titel:
  Antworten mit Zitat      
habs hier mal verdeutlicht (verzweifel echt noch an dieser ollen Aufgabe):

Code:
function [ f, Nullstellen, y] = F_SCHNITTPUNKTE(x, genauigkeit)

f=@(x)0.5*x.^3-5*x.^2+2*x+10;
  finit=f(x)
       
        Schnittstellen=(finit(1:end-1).*finit(2:end))
%hier wird bereits mit hoher Genauigkeit gesucht.....möchte aber nur mit %grober Schrittweite suchen
        vzw=find(Schnittstellen<=0)
        xStartNeu=x(vzw)
        xEndNeu=x(vzw+1)
%Vorzeichenwechsel wurden gefunden; ab hier sollen diese zwei x-Werte %mit hoher Genauigkeit unterteilt werden
        while abs(xEndNeu-xStartNeu)>=genauigkeit
            if (f(xStartNeu+xEndNeu)/2.*f(xEndNeu)>0)
                xStartNeu=(xStartNeu+xEndNeu)/2
            else
                xEndNeu=(xStartNeu+xEndNeu)/2
            end    
        Nullstellen=xEndNeu
        end

        y=f(Nullstellen)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2, 3, 4  Weiter

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.