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

FUnktion liefert falsches Ergebnis

 

whitecrane19
Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 25.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.10.2013, 10:04     Titel: FUnktion liefert falsches Ergebnis
  Antworten mit Zitat      
Hallo Zusammen,

habe zwei Fragen zu Mathlab.

1. Warum liefert folgende Funktion den Wert 2:
Code:
x=10864
y=18817

a=(9*(x^4))-(y^4)+(2*y^2)


Der Wert sollte eigentlich genau 1 sein. Gibt es da eventuell Befehle/Funktionen, die man bei bestimmten Rechnungen berücksichten muss?


2. Wie kann man eine Funktionen wie beispielsweise y=(x-2)^4 ausmultiplizieren und nach fallenden Exponenten ordnen? Eventuell als zweite Möglichkeit noch mit dem Hornerschema.

Letzteres kann man bestimmt durch entsprechende Klammerung realisieren.

Den Befehl für 1.9995 <= x <= 2.0005
0.00005 , Schrittweite kenne ich bereits.


Vielen Dank vorab!
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: 25.10.2013, 11:04     Titel:
  Antworten mit Zitat      
Hallo,

MATLAB arbeitet mit Gleitkommaarithmetik. Doubles haben dabei rund 16 Stellen Genauigkeit, alles andere wird abgeschnitten:

Code:
x=10864
a=(9*(x^4)) % hat 17 Stellen
a-1 == a % kann nicht mehr unterschieden werden

Man spricht dabei von Auslöschung.

Falls du nur Integer-Daten hast, kannst du mit Integer-Datentypen rechnen:
Code:
x=int64(10864)
y=int64(18817)
a=(9*(x^4))-(y^4)+(2*y^2)

Dabei musst du allerdings aufpassen, dass du dich im von diesem Datentyp abgedeckten Bereich bewegst, ansonsten kommt Unsinn heraus.

Alternativ kannst du symbolisch rechnen:
Code:
x=sym(10864)
y=sym(18817)
a=(9*(x^4))-(y^4)+(2*y^2)


Auch das Auflösen der Klammern ist so möglich:
Code:
Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
whitecrane19
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 25.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.10.2013, 11:18     Titel:
  Antworten mit Zitat      
Vielen Dank für den Hinweis. Auf den Datentyp habe ich anfangs auch getipp. Aber im Taschenrechner rechne ich doch auch mit maximal 6 Stellen nach dem Komma. Als Ergebnis erhalte ich trotzdem 1. Zumal es teilweise Rechnungen gibt, die sowohl int als auch double Werte enthalten können. Bei einer selbstgeschriebene Funktion müsste die Eingabe des Anwenders also immer erst geprüft werden oder?
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: 25.10.2013, 11:25     Titel:
  Antworten mit Zitat      
Hallo,

ich würde vermuten, dass dein Taschenrechner vielleicht zwar nur 6 Stellen anzeigt, aber intern doch mit deutlich mehr Stellen rechnet. Wenn ich MATLAB nämlich mit single (ca. 7 Stellen Genauigkeit) rechnen lasse, kommt nämlich noch etwas ganz anderes heraus.
Code:
x=single(10864)
y=single(18817)
a=(9*(x^4))-(y^4)+(2*y^2)


Ich möchte es nochmal betonen: die Ergebnisse sind nicht falsch, sie sind nur nicht genau genug. Bei der Genauigkeit muss man auch die Zwischenergebnisse berücksichtigen. Es käme ja niemand auf die Idee zu unterscheiden, ob zwei Punkte auf dem Mond jetzt 1m mehr oder weniger von der Erde entfernt sind, und so etwas machst du hier letztlich.
Wenn du exakte Ergebnisse haben willst, musst du (wie gezeigt) symbolisch rechnen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 25.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.10.2013, 13:53     Titel:
  Antworten mit Zitat      
Besten Dank, versuche mich jetzt an das Hornerschema, dürfte nicht all zu schwer sein. Danke erst einmal!
Private Nachricht senden Benutzer-Profile anzeigen
 
whitecrane19
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 25.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2013, 08:42     Titel:
  Antworten mit Zitat      
Ich hätte eine Frage zu den Vektoren. Ich kann ja die Schrittweise direkt bei der Definition eines Vektors angeben oder aber mit Schleiofen wie for.

Ich habe nun eine Funktion y=(x-2)^4 und möchte diese Zeichnen. Dazu muss ich ja einen Vektor x mit genügend feiner Stufung wie 100 in einem Intervall, das gegeben ist, definieren. Wie stelle ich das an?

mit x=n:x:m ? Hierbei kann ich aber nur das Intervall mit der Schrittweise angeben, nicht aber die Feinstufung von 100 ...

Und das zweite Problem, wie bekomme ich dann meine Werte, also y1 bis y20 für verschiedene x-Werte?
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: 27.10.2013, 09:45     Titel:
  Antworten mit Zitat      
Hallo,

was meinst du mit Feinstufung? Die Anzahl der Unterteilungsschritte? Dann kannst du linspace nehmen.
Wenn du einen Vektor an die Funktion fütterst, bekommst du auch einen Vektor heraus.

Code:
x = linspace(a,b,100);
y = (x-2).^4; % den Punkt nicht vergessen
plot(x,y)


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 25.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2013, 09:50     Titel:
  Antworten mit Zitat      
Das habe ich bereits versucht. Aber ich bekomme für y nur 1 Ergebnis. Aber ich habe doch 100 Werte für x, also benoetige ich auch 10ß0 Werte für y.

Dann möchte ich natürlich ausmultiplizieren und nach fallenden Exponenten auflösen. Geht das alles mit der Trapez-Formel?

Als drittes mit Hornerschmema ...
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: 27.10.2013, 10:01     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Das habe ich bereits versucht. Aber ich bekomme für y nur 1 Ergebnis. Aber ich habe doch 100 Werte für x, also benoetige ich auch 100 Werte für y.

Dann ist bei deinem Versuch etwas schiefgegangen. Um dir da weiterhelfen zu können, müsstest du deinen Versuch posten.

Zitat:
Dann möchte ich natürlich ausmultiplizieren und nach fallenden Exponenten auflösen. Geht das alles mit der Trapez-Formel?

Die Trapez-Formel ist ein Integrationsverfahren. Die Formeln werden da so ausgewertet wie sie sind. Wenn du ausmultiplizieren möchtest, musst du das selbst mit expand machen, siehe 25.10.2013, 10:04.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 25.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2013, 11:59     Titel:
  Antworten mit Zitat      
Mit dem sort-Befehl lässt sich das Ergebnis aber nicht nach fallenden oder aufsteigenden Exponenten ordnen. Das ist mein Problem ... Darüber hinaus kann ich das nicht mehr ploten, nachdem ich es ausmultipliziert habe, da syms x ist und nicht double ...
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: 27.10.2013, 12:32     Titel:
  Antworten mit Zitat      
Hallo,

zumindest im vorliegenden Fall sind die Exponenten automatisch fallend geordnet. Ich verstehe allerdings nicht, welchen Einfluss die Sortierung der Terme überhaupt auf das weitere Vorgehen haben soll.

Du kannst z.B. mit subs wieder Werte einsetzen und dann plotten, oder ezplot verwenden.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 25.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2013, 12:49     Titel:
  Antworten mit Zitat      
Also direkt ploten geht dann nicfht mehr mit plot (x,y) und das Konvertieren mit x=double(x) z.B. auch 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: 27.10.2013, 12:59     Titel:
  Antworten mit Zitat      
Hallo,

nein, das geht nicht mehr. Abhilfe siehe zweiter Teil meines vorherigen Beitrags.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.10.2013, 13:08     Titel:
  Antworten mit Zitat      
Hallo whitecrane19,

Zitat:
Mit dem sort-Befehl lässt sich das Ergebnis aber nicht nach fallenden oder aufsteigenden Exponenten ordnen.

Das ist für Dich sicherlich ganz klar, ich verstehe das aber nicht, weil die Details fehlen. Für eine Diskussion im Forum ist es besser, Du postest den Code, und zeigst das gewünschte Ergebnis.
Man kann per SORT natürlich auch die Exponenten sortieren, es kommt nur darauf an, wie man die Exponenten gespeichert hat.

Zitat:
Darüber hinaus kann ich das nicht mehr ploten, nachdem ich es ausmultipliziert habe, da syms x ist und nicht double ...

Das hieße dann, dass Deine eigentlich Frage ist, wie man symbolische Ausdrücke wieder in numerische umwandelt? Wie wäre es mit dem DOUBLE() Befehl?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
whitecrane19
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 25.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2013, 15:46     Titel:
  Antworten mit Zitat      
Double geht ja nicht double (x) führt zu einem Fehler ...
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  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.