Fra C til java!

Tags:    java

Hej jeg er i gang med at lave noget på Gymnasium om approximation af rødder i ligninger og jeg har fundet en metode på

http://en.wikipedia.org/wiki/Method_of_false_position

som står i C men jeg vil gerne oversætte den til java sådan at jeg kan finde ud af at bruge den men jeg kan ikke for det til at virke!

Her er det jeg har skrevet i Java!

import java.lang.*;

public class FP {

public static double main(String argv[]) {

public static double FalsPosition(double s, double t, double e, int m){
int n;
int side = 0;

double r;
double fr;
double fs = f(s);
double ft = f(t);

for (n = 1; n <= m; n++)
{
r = (fs*t - ft*s) / (fs - ft);
if (f(Math.abs(t-s)) < e * f(Math.abs(t+s))) break;
fr = f(r);

if (fr * ft > 0)
{
t = r; ft = fr;
if (side==-1) fs /= 2;
side = -1;
}
else if (fs * fr > 0)
{
s = r; fs = fr;
if (side==+1) ft /= 2;
side = +1;
}
else break;
}
return r;
}


}

private static double f(double x) {

return Math.cos(x)-x;

}
}




3 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato

  • Skriv Java-koden så den matcher C-koden fuldstændig før du ændre på struktur, funktions- og variabelnavne, m.v.

  • Main-metoden i C-eksemplet (http://en.wikipedia.org/wiki/Method_of_false_position) har ingen returværdi. Hvorfor ændre den til "double" i Java-versionen? Lad den være "void" :)

  • Variablen "r" bliver ikke initialiseret, hvis du fjerner løkken returneres "null".


Jeg har ændret koden for dig og struktureret den på samme måde som C-eksemplet. "r" bliver initialiseret til 0.

Fold kodeboks ind/udKode 


Koden fungerer og giver resultatet "0.6850733573260451". På Wikipedia står der resultatet skal blive tilnærmelsesvis "0.865474033101614". Så må din matematikekspertise afgøre om det er et tilfredsstillende resultat. :)

Håber dette hjalp.

- Kasper

EDIT
Jeg skal da vist til at lære hvad en kalender er? :o



Indlæg senest redigeret d. 24.07.2010 19:59 af Bruger #16019
Jeg må melde pas på matematikken, men du skal være opmærksom på, at i C forventer sinus og cosinus funktionerne grader, mens Java forventer radianer.



Jeg har ikke set den metode før, men den virker da meget simpel at implementere, men den kræver altså at du har en nogenlunde ide om hvor rødderne ligger i forvejen.

Til din java kode har jeg:
-du behøver ikke at importe java.lang.* det bliver gjort automatisk;
-i starten skriv: import static java.lang.Math.*; så slipper at skrive Math. foran alle matematik funktioner.
-Jeg tror altså ikke du må neste funktionen inden for main metoden, så lad vær med det.
-Din main metode har jo ikke noget kode!!

Jeg tror at hvis du skal lave noget fuldt automatiseret rod finding, så skal du først have gang i en analyse af monotoni forhold (lærer man stadig om det i gymnasiet?), for at finde funktionens extremaer, når disse extremaer er fundet, kan du benytte den metode du selv har fundet til at finde rødderne.
Jeg tror dog at automatiseret monotoni forholds analyse er out-of-scope i gymnasiet. Men husk på at den afledte (den differentiere) i et ektrema er 0.

Hvis du bare skal finde een rod, så synes jeg hellere at du skal kigge Newton iteration.
http://en.wikipedia.org/wiki/Newton%27s_method
evt. kan du også kigge på et par slides fra programmerings kurset på Aarhus universitet:
http://www.daimi.au.dk/dProg2/slides/note_real_6.pdf
der er ihvertfald et eksempel med kvadratrod



t