Computer Hardware Forum - TweakPC

Computer Hardware Forum - TweakPC (https://www.tweakpc.de/forum/)
-   Programmiersprachen (https://www.tweakpc.de/forum/programmiersprachen/)
-   -   [JAVA] Nullstelle(n) finden (https://www.tweakpc.de/forum/programmiersprachen/88587-java-nullstelle-n-finden.html)

Profi Overclocker 29.09.2012 02:16

[JAVA] Nullstelle(n) finden
 
Moin,
ich hoffe mal, ich finde hier ein paar Java fähigere als ich es bin ^^

Das zulösende Problem:
Es soll ein kleine Programm entstehen, welches von einer Ableitung (bis Grad 8) eine Nullstelle bestimmt, dabei ist es unwichtig, wo diese liegt.
Mein Ansatz war es, dass man den exponent bzw. den Faktor eines Gliedes der Ableitung in Felder einträgt, hier liegt aber nicht mein aktuelles Problem, dass klappt soweit wie es soll.
Viel mehr ist es im Nachhinein eine Nullstelle zu finden, bzw. funktioniert dies nicht.
Wofür das ganze? Die Aufgabe wurde als Zusatz zwar im Mathe LK gestellt, weil wir des öfteren mal eine Nullstelle "erraten" müssen, was aber bei einigen Funktionen alles andere als gemütlich ist. (Hornerchema etc.)
Nun ist soweit bekannt, dass Nullstellen der Ableitung sich erraten lassen, indem man Teiler der Konstante verwendet. Dabei bilden der Positive als auch der Negative Betrag der Konstante die Spanne in welcher die Nullstellen liegen (deren X-Koordinate).

Um das ganze zu beschleunigen, soll eine Art binärsuche Programmiert werden.
Nach verteilung der Variablen und der gleichen, bekomme ich folgende Zeile raus, welche zum berechnen des Wertes für f'(x) geeignet ist. (In der GUI werden die Werte der Ableitung bereits schon eingetragen).

diese Laute wie folgt:
[quote]
calc = (Math.pow(a,aa)*x) + (Math.pow(b,bb)*x) + (Math.pow(c,cc)*x) + (Math.pow(d,dd)*x) + (Math.pow(e,ee)*x) + (Math.pow(f,ff)*x) + (Math.pow(g,gg)*x) + (Math.pow(h,hh)*x) + i;

[/quote]calc bildet dabei meine Variable zum speichern des Ergebnisses. i bildet die Konstante.

Nun zum eigentlichen Problem:
Ausgehen von einem Wert von 4000 für i ergibt sich die Spanne von -4000 bis +4000 für i (soll im späteren Verlauf eingegrenzt werden können, wenn zum Beispiel ein Wort >0 gesucht wird).
Folglich war mein Ansatz:
n = -4000
z = 4000
zuerst wurden diese Werte betrachtet, falls mit einem dieser sich eine Nullstelle ergab, war das Problem schon gelöst.
Danach began die "Suche".
Dazu nahm ich mit den Mittelwert beider Zahlen (0) und setzte ein. Je nach konstante war das Ergebnis enstprechend positiv oder negativ.

Nun wurde zuerst abgefragt, ob dieser Wert 0 entsprach (anfags natürlich nicht, tolleranz von 0.0001 war gegeben sowohl nach oben als auch nach unten). Sollte diese Bedingung im späteren Verlauf stimmen, wurde die abbruchbedingung der "While-Schleife" auf true gesetzt, die errechnete Koordinate in eine ausgabe Variable gespiechert etc.

Die nächste zu prüfende Bedingung war es, ob das Ergebnis durch einsetzen von 0 ober oder unterhalb von 0 lag.

lag es unterhalb (also zu niedrig) wurde n auf den zuvor berechneten Mittelwert gesetzt, andersherum lag das Ergebnis oberhalb wurde z auf den Mittelwert gesetzt. Soweit die Theorie. Nun sollte sie der Wert für calc immer weiter der 0 annähern, bis dieser im Tollerenzbereich lag.
Mein Problem jedoch war es, nie einen realistichen Wert zu erhalten. Der Wert lies sich beeinflussen etc. Ergebnisse stimmten leider nicht. (Einfach Funktionen und mit bsp. Geogebra gegengeprüft).

Beispielsweise f'(x)=2x^2-2, die Nullstellen wären ja dementsprechend 1 bzw. -1. Mein Ergebnis lag deutlich unterhalb bei 0.5.

Ich hoffe hier kann mir wer helfen ;)
Wenn noch infos gebraucht werden, gerne melden^^

btw. das verwendete Prog. nennt sich "Java-Editor".

Fakk-asrock 29.09.2012 17:48

AW: [JAVA] Nullstelle(n) finden
 
ehm, bringt dich das Newtonverfahren vllt weiter? weil du ja Zahlen nur auf eine Genauigkeit suchen kannst, ist villeichte eine Annäherung besser?

[url=http://de.wikipedia.org/wiki/Newton-Verfahren]Newton-Verfahren[/url]

Profi Overclocker 29.09.2012 18:02

AW: [JAVA] Nullstelle(n) finden
 
Hehe, danke ^^
Das hab ich mir bereits mal durchgelesen, hab jetzt meins so hinbekommen wie es laufen soll ;)

[quote]
calc = (Math.pow(a,aa)*x) + (Math.pow(b,bb)*x) + (Math.pow(c,cc)*x) + (Math.pow(d,dd)*x) + (Math.pow(e,ee)*x) + (Math.pow(f,ff)*x) + (Math.pow(g,gg)*x) + (Math.pow(h,hh)*x) + i;

[/quote]

hier lag der Fehler :D
um es kurz zu halten:
anstatt wie vorher (Math.pow(a,aa)*x) (als kleines Beispiel) muss es aber (Math.pow(x,aa)*a) lauten und somit lief es dann auch :)
Sp spät läuft nunmal nicht mehr alles rund xD


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 Uhr.

Powered by vBulletin® Version 3.8.10 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
SEO by vBSEO 3.5.2 ©2010, Crawlability, Inc.