Cosinus einer Zahl

Kaluzo

Mitglied
Guten Tag Java-Forum Community,
ich bin IT_Managementstudent und in meiner absoluten Anfangsphase. Ich habe keiner Vorkenntnisee über das Programmieren und hoffe das mir jemand mit meinen Problem helfen kann. Folgende Aufgabenstellung:

Ihr Programm soll nun den Cosinus dieser dezimalZahl berechnen. Dazu sollen Sie ein
Näherungsverfahren verwenden und dieses mit der Bibliotheksfunktion
Math.cos() vergleichen.
Eine Näherung lautet:
cos(x)= 1-(x^2/2!)+(x^4/4!)-(x^6/6!) +...
Sie sollen diese Reihe fortsetzen,
solange der zu addierende Term betragsmäßig größer als 10^-6 ist. Dann geben Sie das Ergebnis, das Resultat der Bibliotheksfunktion, und die Anzahl von Termen, die sie addieren mussten, aus. Stellen Sie sicher, dass auch negative Eingaben und 0 korrekt behandelt werden.


Ich verstehe das ich einen Double Eingeben muss damit diese Zahl berechnet wird, aber der rest ist mir bisher noch völlig unklar.
Ein Beispiel:
Eingabe 1,5
Ausgabe: 0.07073693411690848 Bibliothek: 0.0707372016677029 Terme: 5

Kann mir jemand erklären wie ich hier vorzugehen habe?
Für jede Antwort oder Anregung die mir helfen kann wäre ich sehr dankbar
 

Viktim

Bekanntes Mitglied
Mit einem Scaner oder einem FileReader kannst du einlese, mit Double.parseDouble kannst du aus dem eingelesenen String einen Double-Wert machen.
Die Formel könntest du mit forschleifen machen, und Math.cos kannst du einfach benutzen....
 
N

neoexpert

Gast
cos(x)= 1-(x^2/2!)+(x^4/4!)-(x^6/6!) + ...
genau und sinus ist
sin(x)= (x^1/1!)+(x^3/3!)-(x^5/5!) + ...
Diese summen heissen Taylor-Polynom.
Code:
double cos(double x, int p){
double r=0.0;
for(int i=1;i<p;i+=2)
r+=pow(x,i)/fak(i);
return r;
}
Habe nicht getestet, musst noch pow (oder Math.pow nehmen) und fak implementieren.
 
N

neoexpert

Gast
Übrigens demnächst kann man zeigen z.B. dass ln(-1)=iPi und die besonders faszinierende Formel testen:
e^(iPi)=-1
 
N

neoexpert

Gast
Hier nochmal getestet und korrigiert:
Java:
public class Main 
{
    double cos(double x, int p){
        double r=0.0;
        for(int i=0;i<p;i+=2)
            r+=Math.pow(-1,i/2)*Math.pow(x,i)/ fak(i);
        return r;
    }
    long fak(long n){
        if(n==1||n==0) return 1;
        return n*fak(n-1);
    }
   
    public static void main(String[] args)
    {
        Main m=new Main();
        System.out.println(m.cos(Math.PI,20));
    }
}
 
Zuletzt bearbeitet von einem Moderator:

JStein52

Top Contributor
Aber du hast schon die Aufgabe gelesen ? Deine cos(.....) passt noch nicht wirklich. Die Abbruchbedingung ist noch falsch (infolgedessen auch die Signatur der Methode)
Und die geforderten Eingaben des Benutzers bzw. die Ausgaben sind auch nicht drinnen aber das ist eher ein Schönheitsfehler. ;););)
 
N

neoexpert

Gast
Damals war das Jetzt demnächst. Im Video wird das gezeigt. Darauf wollte ich hinaus.
 

Nuiton

Bekanntes Mitglied
Wenn man die Taylor-Reihe fuer die Sinus und Kosinusfunktion berechnet, koennte man auch beweisen, dass sin^2(x)+cos^2(x) = 1, aber wozu?! :D
 

Kaluzo

Mitglied
Also wenn ich ehrlich bin stehe ich damit immernoch vor einem Problem. Wie gesagt befinde ich mich ganz am Anfang meines Studiums und hatte bisher noch keine Erfahrung im Programmieren oder dem Einfügen des Cos in eine dieser Schleifen. Uns wurde zwar gesagt das wir Math.pow verwenden dürfen, allerdings nicht was es bedeutet: Der Ansatz von neoexpert sieht vielversprechend aus, aber ich würde es begrüßen wenn man mir die einzelnen Schritte erklären könnte die dort vor sich gehen.

Ich erknne das man mit verschiedenen methoden arbeitet (was mir bis dato auch völlig neu war)
Die Schleife kann ich auch lesen, aber der Grund für diese Zusammenstellung bereitet mir Kopfzerbrechen.
Im wesentlichen weiß ich mit math.pow und fak nicht viel anzufangen und kann diese höchstens interpretieren.

Danke schonmal für eure rege Beteiligung! Wirft ein sehr gutes Licht auf dieses Forum
 
N

neoexpert

Gast
Ok. Wenn du die cos Funktion anschaust, siehst du dort die for-Schleife. Diese berechnet die Formel die du hinheschrieben hast. pow kommt vom englischen "Power" -> Potenzieren. 2^3 kann man z.B. so berechnen:
Math.pow(2,3);
Du kaannst auch die Zwischen-Ergebnisse ausgeben lassen:
Java:
double cos(double x, int p){
        double r=0.0;
        for(int i=0;i<p;i+=2){
            r+=Math.pow(-1,i/2)*Math.pow(x,i)/ fak(i);
            System.out.println(r);
        }
        return r;
    }
 
N

neoexpert

Gast
! Steht für Fakultät.
n! ist das Produkt aller natürlichen Zahlen bis n.
Z.B:
5!=1*2*3*4*5
 

Kaluzo

Mitglied
Das hilft mir schon sehr für mein Verständnis, danke sehr. Ich habe jetz gleich erstmal Vorlesung, probiere dann mal etwas rum und schreibe dann meine Ergebnisse. Bis dann
 

Kaluzo

Mitglied
Das hilft mir schon sehr für mein Verständnis, danke sehr. Ich habe jetz gleich erstmal Vorlesung, probiere dann mal etwas rum und schreibe dann meine Ergebnisse. Bis dann
Hey Leute, ich hatte relativ viel zutun und konnte leider nicht mehr die nötige Zeit aufbringen hier nochmal was zu schreiben. Heute abend kommt bestimmt etwas dazu, sitze nämlich in diesem Augenblick im Labor und muss diese Aufgabe irgendwie fertig bringen. Mal sehen was dabei herraus kommt
 

Kaluzo

Mitglied
So hier mal ein kleines feedback:
Ich hab leider keine Ahnung.

Ich habe verschiedene Lösungsansätze ausprobiert aber im großen und ganzen kann ich nicht begreifen was ich zutun habe, nach einem Gespräch mit meinem prof ist folgenes klar geworden:

-Ich muss also 2 Zahlen einlesen (double x/y = in.nextDouble())
-Dazu soll ich ein Näherungsverfahren benutzen und es mit Math.Cos() vergleichen. (Das verstehe ich: Die gegebene Formel gibt das Cosinus näherungsweise an und ich soll dieses mit einer hinterlegten Bibliothek vergleichen)
-Solange das Resultat beträgsmäßig größer ist als 1e-6 soll verglichen und ausgegeben werden.
meine bisherige Eingabe:

public static void main(String[] args) {

Scanner in = new Scanner(System.in);
double x = in.nextDouble();
double y = in.nextDouble();
int z ;
double ersterTerm = 1;
double resultat = 0;
int counter = 0;
( double potenz = x*x / 2; ) -> nur ne Idee gewesen...


while ( ersterTerm > 1e-6 ){
resultat = resultat + ersterTerm;
counter++;

ich muss also eine Möglichkeit finden, die zu addierenden Terme darzustellen, den Counter entsprechend zu erhöhen und damit aus x^2/!2 -> x^4 / 4! zu erreichen.

Ich wusste gerade nicht wie ich einen Code eingebe. gucke aber gleich nochmal nach. Fahre jetzt nachhause.
 

JStein52

Top Contributor
So etwa:

Code:
    private static double cos(double x){
        double r=0.0;
        for(int i=0; ;i+=2) {
            double nextTerm = Math.pow(x,i)/ fak(i);
            if (Math.abs(nextTerm) < 0.0000001) {
                System.out.println("Es waren "+i/2+" Iterationen notwendig");
                System.out.println("Berechnetes Ergebnis: "+r);
                System.out.println("Math.cos ergibt:      "+Math.cos(x));
                return r;
            }
            else r = r + Math.pow(-1,i/2)*nextTerm;
        }
    }

    public static void main(String[] args) {
    double value = 1.031;
    cos(value);
    }

    private static long fak(long n){
        if(n==1||n==0) return 1;
        return n*fak(n-1);
    }

du musst in main jetzt nur noch Code einbauen um den "value" via Scanner einzulesen.
 
Zuletzt bearbeitet:

Kaluzo

Mitglied
Alles klar. Damit werde ich das wohl hinkriegen.
Ich habe mich in den letzten Tagen intensiv mit programmieren beschäftigt und habe nun auch etwas mehr Ahnung schätze ich.

Ich danke jedem für seine rege Beteiligung :)
Eine paar letzte Fragen habe ich noch: Als ihr angefangen habt zu programmieren, was war für euch das Schwierigste dabei? Haben euch bestimmte Sachen gut dabei geholfen? Habt ihr eventuell Literatur die ihr einem Neuling empfehlen könnt?
Ich wollte mir heute "Java ist eine Insel" bestellen, da gibt es zwar auch gute kostenlose Ebooks von, ich bin aber eher ein Fan von Papier und Elektronik zugleich.
Von unserem Prof. wurde uns "Sprechen sie Java?" empfohlen und daran hält er sich auch sehr. Für mein Verständnis ist dieses Buch jedoch eher ein Nachschlagewerk als wirkliche Lernhilfe. Bin aber auf eure Meinungen dazu gespannt.

MFG Kaluzo
 

Viktim

Bekanntes Mitglied
Wenn du noch ganz in den Anfängen steckst, kann ich dir Schrödinger Programmiert empfehlen.
Ist zwar etwas kindlich gemacht, aber dadurch versteht man auch alles :D
 

VfL_Freak

Top Contributor
Moin,
Ich wollte mir heute "Java ist eine Insel" bestellen
...
Von unserem Prof. wurde uns "Sprechen sie Java?" empfohlen und daran hält er sich auch sehr. Für mein Verständnis ist dieses Buch jedoch eher ein Nachschlagewerk als wirkliche Lernhilfe
Das vom Prof. empfohlene Buch kenne ich nicht, aber die Insel ist auch eher Nachschlagewerk denn Lernhilfe ...

Gruß Klaus
 

Neue Themen


Oben