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

 

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, 21:47     Titel:
  Antworten mit Zitat      
Hallo,

der Klammernfehler ist im geposteten Code noch nicht korrigiert.
Zudem suchst du genau im falschen Intervall weiter: wenn das Produkt größer 0 ist, heißt es ja, dass in diesem Intervall kein Vorzeichenwechsel ist. Demnach muss xEndNeu auf den Mittelpunkt des Intervalls angepasst werden, damit im anderen Intervall weitergesucht wird.

So funktioniert's:
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, 22:03     Titel:
  Antworten mit Zitat      
war noch die alte Datei;)
aber es funktioniert einfach nicht. Mittwoch ist Abgabe und eigentlich sollte dieses dämliche Projekt was für den Nachmittag sein... auf jeden Fall werden die Werte nur mit extremen Rechenaufwand errechnet. Das sollte nicht sein. Zudem wiechen diese ab. Ein Schnittpunkt sollte z.B. den Wert X=-1,170935; y=-0,000043 haben. Der Quellcode von mir weicht davon immer ab Sad
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, 23:02     Titel:
  Antworten mit Zitat      
Hallo,

mit meinem Vorschlag von eben liefert
Code:
tic, F_SCHNITTPUNKTE([-5:0], 1e-6), toc


innerhalb von 0.003 Sekunden

Nullstellen =

-1.1709

y =

8.4092e-06

Das ist die Lösung, und den Rechenaufwand finde ich nun nicht gerade extrem.

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, 23:30     Titel:
  Antworten mit Zitat      
das geht für einen Schnittpunkt gut. Bei z.B.
Code:
F_SCHNITTPUNKTE([-10:10], 1e-5)

nicht mehr. Dann sind die Rechenfehler extrem.
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, 23:50     Titel:
  Antworten mit Zitat      
Hallo,

wenn du mehrere Schnittpunkte berechnen willst, dann musst du eine Schleife über die Vorzeichenwechsel machen. Wie soll das denn sonst gehen?

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: 17.11.2014, 00:25     Titel:
  Antworten mit Zitat      
Hallo Harald,

dachte es wuerden alle Schnittpunkte berechnet werden. Wieso nur einer und wieso wird noch eine weitere Schleife benoetigt? Mir ist nicht so ganz klar wie Matlab die Anweisungen arbeitet.....
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: 17.11.2014, 00:44     Titel:
  Antworten mit Zitat      
Hallo,

dann schau dir das doch mal Schritt für Schritt an.
Es ist nun nicht so, dass nur mit einem Schnittpunkt gerechnet wird. Probleme gibt es allerdings in der if-Verzweigung, wenn du bei einem Schnittpunkt das linke Intervall nehmen müsstest und beim anderen das rechte - die Aufspaltung kann nicht klappen. Siehst du auch, wenn du das mal im Debugger durchgehst.

Zitat:
und wieso wird noch eine weitere Schleife benoetigt?

Weil es ohne nicht klappt?

Zitat:
Mir ist nicht so ganz klar wie Matlab die Anweisungen arbeitet.....

Dann geh's mit dem Debugger durch. Wenn bei if-Bedingungen mit Vektoren gearbeitet wird, muss die Bedingung für alle Elemente erfüllt sein, damit der Zweig ausgeführt wird - und das wird bei den verschiedenen Schnittpunkten nunmal nicht der Fall sein.

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: 17.11.2014, 07:40     Titel:
  Antworten mit Zitat      
verstehe ehrlich gesagt nichts von alldem, was du mir zu sagen versuchst. Debugger? Wie verwendet man diesen?
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: 17.11.2014, 10:39     Titel:
  Antworten mit Zitat      
Hallo,

in der Hilfe nachschlagen solltest du dann schon...
http://www.mathworks.com/help/matlab/debugging-code.html

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: 18.11.2014, 21:20     Titel:
  Antworten mit Zitat      
die Matlab eigenen Hilfestellungen sind etwas Englisch zu viel.....
habs mal ganz simpel mit nem neuen Ansatz versucht. Aber was ist denn nun ein Vektor, eine Matritze, ein skalar und was es noch so alles gibt? Ich denke grundsätzlich in array, wo jede einzelne Zelle auch ansprechbar ist. Aber in Matlab ist das nicht wirklich ersichtlich.

Code:
xStart=input('Startwert:');
        xEnd=input('Endwert:');
        Schrittweite=input('Delta X:');
        genauigkeit=input('Genauigkeit?');
        format long;
        x=xStart: Schrittweite: xEnd;
        a=bla(x);
        for i=1:1:(length(x)-1)
            if (a(i))*(a(i+1))<0
                z=(a(i))*(a(i+1))
               xn1=x(i)
               xn2=x(i+1)
        while abs(xn1-xn2)>=genauigkeit
            if (bla(xn1)*bla(xn2))<0
            xn1=(xn1+xn2)/2;
            else
            xn2=(xn1+xn2)/2;
            end
               plot(x,a)
        end      
            end
        end
        Nullstelle=(xn2+xn1)/2
     case 2
        exit
end      

 


Und wie immer das übliche Problem. Nur eine Nullstelle. Option Genauigkeit ist sinnlos; man muss schon die Schrittweite sehr fein einstellen, damit die Ergebnisse exakt werden. Dann jedoch wieder mit dem Nachteil des hohen Rechenaufwands
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: 18.11.2014, 22:13     Titel:
  Antworten mit Zitat      
Hallo,

wieso fängst du denn jetzt von vorne an? Das einzige, was du brauchtest, war eine for-Schleife.

Ich habe mal in den vorherigen Stand eine Schleife eingebaut, und es klappt wunderbar - siehe Anhang.
Code:
[ f, Nullstellen, y] = F_SCHNITTPUNKTE(-50:50, 1e-6);


Zu deinem neuen Versuch:
Zitat:
Aber was ist denn nun ein Vektor, eine Matritze, ein skalar und was es noch so alles gibt? Ich denke grundsätzlich in array, wo jede einzelne Zelle auch ansprechbar ist. Aber in Matlab ist das nicht wirklich ersichtlich.

Ja, grundsätzlich ist alles ein Array. Im Workspace Browser siehst du die Dimensionen der Variablen und damit, was ein Skalar, was ein Vektor, und was eine Matrix ist.

Wenn ich deinen Code in den Editor kopiere, bekomme ich rechts 2 rote und 4 orange Balken, die auf Probleme im Code hinweisen. Das solltest du beheben.

Was ist bla?
Du überschreibst nullstelle ständig. Wenn du einen Vektor daraus machen möchtest, musst du hineinindizieren:
Code:
Nullstelle(i) = ...


Grüße,
Harald

F_SCHNITTPUNKTE.m
 Beschreibung:

Download
 Dateiname:  F_SCHNITTPUNKTE.m
 Dateigröße:  800 Bytes
 Heruntergeladen:  410 mal
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: 18.11.2014, 22:38     Titel:
  Antworten mit Zitat      
Bei mir funktionierts nicht. Bekomme überhaupt keine Werte. bla ist die Funktion y(x). Die Nullstellen werden ständig überschrieben, da mit jeder Iteration neue Nährungswerte entstehen, die für die nächste Iteration verwendet werden sollen. Eine andere Lösung kenne ich halt nicht.
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: 18.11.2014, 22:48     Titel:
  Antworten mit Zitat      
Hallo,

ich habe dir gerade eine Lösung geschickt!

Wenn ich das aufrufe, bekomme ich folgende Ergebnisse:

>> [ f, Nullstellen, y] = F_SCHNITTPUNKTE(-50:50, 1e-6)
f =
@(x)0.5*x.^3-5*x.^2+2*x+10
Nullstellen =
-1.1709 1.8282 9.3427
y =
1.0e-05 *
0.8409 -0.1913 0.9897

Wenn du diese Ergebnisse nicht bekommst, dann wirst du das anders aufgerufen haben oder vielleicht auch eine deiner veralteten Dateien. Ohne weitere Informationen werde ich dir da jedenfalls nicht weiterhelfen können.

Zitat:
Die Nullstellen werden ständig überschrieben

... und ich habe dir geschrieben warum dies so ist und wie du Abhilfe schaffen kannst.

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: 18.11.2014, 23:03     Titel:
  Antworten mit Zitat      
so sehen die 2 Files aus. Aufruf über F5 (run). Aber was spricht dagegen, ständig die Nullstellen zu überschreiben? Ist von mir so gewollt.

Skript.m
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=FSCHNITTPUNKTE(x, genauigkeit);
       
        elseif ErhGenauigkeit==0;
        x=xStart: Abstand: xEnd;
        f=FSCHNITTPUNKTE(x, genauigkeit);
       
       
        end
     case 2
        exit
end


function.m

Code:
function [ f, Nullstellen, y] = FSCHNITTPUNKTE(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);
Nullstellen = zeros(size(vzw));
for I = 1:numel(vzw)
    xStartNeu=x(vzw(I));
    xEndNeu=x(vzw(I)+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(I)=xEndNeu;
    end
end

y=f(Nullstellen);
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: 18.11.2014, 23:19     Titel:
  Antworten mit Zitat      
Hallo,

...und woher soll ich jetzt wissen, welche Eingaben du zur Laufzeit machst? Das ist doch der entscheidende Punkt. Ich habe dir schließlich einen funktionierenden Beispielaufruf geliefert.

Zitat:
Aber was spricht dagegen, ständig die Nullstellen zu überschreiben?

Dass du dann nur eine Nullstelle bekommst, weil die vorher gefundene von der neuen überschrieben wird.

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