# Cosinus einer Zahl



## Kaluzo (8. Nov 2016)

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 (8. Nov 2016)

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....


----------



## neoexpert (8. Nov 2016)

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. 

```
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.


----------



## neoexpert (8. Nov 2016)

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


----------



## JStein52 (8. Nov 2016)

neoexpert hat gesagt.:


> Übrigens demnächst kann man zeigen z.B. dass ln(-1)=iPi


Toll. Hilft ihm das jetzt was ?
@Kaluzo : Hat das dir bis jetzt überhaupt geholfen was man dir erklärt hat ? Hast du denn inzwischen eine Idee wie du da rangehen könntest ?


----------



## neoexpert (8. Nov 2016)

Hier nochmal getestet und korrigiert:

```
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));
    }
}
```


----------



## JStein52 (8. Nov 2016)

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.


----------



## JStein52 (8. Nov 2016)

neoexpert hat gesagt.:


> Übrigens demnächst kann man zeigen z.B. dass ln(-1)=iPi


Mich würde trotzdem interessiern warum man das demnächst zeigen kann und nicht schon jetzt ?


----------



## neoexpert (8. Nov 2016)

JStein52 hat gesagt.:


> Mich würde trotzdem interessiern warum man das demnächst zeigen kann und nicht schon jetzt ?


Wieso Jetzt? Dieses Musik Video ist echt gut:


----------



## JStein52 (8. Nov 2016)

neoexpert hat gesagt.:


> Wieso Jetzt?


Du schreibst man kann das demnächst zeigen, also kann man es jetzt noch nicht zeigen ?!


----------



## neoexpert (8. Nov 2016)

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


----------



## JStein52 (8. Nov 2016)

neoexpert hat gesagt.:


> Damals war das Jetzt demnächst.


 ist das nicht invers rekursiv und endet unweigerlich in einem Wurmloch


----------



## Nuiton (8. Nov 2016)

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?!


----------



## JStein52 (8. Nov 2016)

Weil dann endlich klar ist dass Pythagoras doch recht hatte


----------



## Kaluzo (9. Nov 2016)

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


----------



## mrBrown (9. Nov 2016)

Verstehst du denn die mathematische Formel?


----------



## neoexpert (9. Nov 2016)

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:

```
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;
    }
```


----------



## Kaluzo (9. Nov 2016)

mrBrown hat gesagt.:


> Verstehst du denn die mathematische Formel?


Vermutlich nicht in gänze: Mir ist nicht ganz klar, was die Ausdrücke 2! 4! 6! zu bedeuten haben, ich habe bisher ! als "nicht" verstanden mit sinne von if (i !=0) etc else (..)


----------



## neoexpert (9. Nov 2016)

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


----------



## Kaluzo (9. Nov 2016)

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 (15. Nov 2016)

Kaluzo hat gesagt.:


> 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 (15. Nov 2016)

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 (15. Nov 2016)

So etwa:


```
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.


----------



## Kaluzo (19. Nov 2016)

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 (23. Nov 2016)

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


----------



## VfL_Freak (23. Nov 2016)

Moin,


Kaluzo hat gesagt.:


> 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


----------

