# C++ Logarithmus Funktion



## 123bz (6. Juni 2011)

Hallo,
Ich soll ein C++-Programm schreiben, dass mit hilfe folgender Formel:

ln(x) = 2 * (((x-1)/(x+1)) + (((x-1)^3)/(3*(x+1)^3)) +( ((x-1)^5)/(5*(x+1)^5))+...
....+((x-1)^(2n+1))/((2n+1)*(x+1)^(2n+1))+...)

den Logarithmus berrechnet.
Dazu soll eine Funktion deklariert und definiert werden: 
double myLog( double x, int n)
welche die Summe über die ersten n Summanden ausführt und den Wert zurückgibt.

Wie schreibe ich die Formel in eine Funktion?

Bitte um Hilfe


----------



## deepthroat (6. Juni 2011)

Hi.

Du mußt eine Schleife programmieren. Wie sieht denn diese Schleife aus? Wieoft muss diese Schleife durchlaufen werden?

Dazu schau dir mal die einzelnen Summanden ganz genau an. Welcher Teil der Summanden ist immer gleich? Welcher Teil ist _variabel_?

Versuche den _variablen_ Teil durch eine _Variable_ zu ersetzen.

Versuche eine Beziehung zwischen dem Wert der Variablen und der Anzahl der Schleifendurchläufe zu finden.

Versuche wenigstens einen Ansatz zu finden und stelle ihn zur Diskussion.

Gruß


----------



## 123bz (6. Juni 2011)

Hi,
also was ich bisher habe ist: 
der letzte Teil der Formel enthält die Variable n für die "Genauigkeit"
also muss ich nur diesen Teil beachten und  addieren mit einer for-schleife von 1 bis n.
Soweit die Theorie, aber ich (als Anfänger) habe Schwierigkeiten die Formel  in eine Funktion zu bekommen. Allein das potenzieren mit 2n+1 haut mit pow (zumindest bei mir) nicht hin.


----------



## deepthroat (6. Juni 2011)

123bz hat gesagt.:


> Hi,
> also was ich bisher habe ist:
> der letzte Teil der Formel enthält die Variable n für die "Genauigkeit"
> also muss ich nur diesen Teil beachten und  addieren mit einer for-schleife von 1 bis n.


Richtig. Wie sieht diese Schleife also aus?

Versuche die anderen Fragen ebenfalls zu beantworten.


123bz hat gesagt.:


> Soweit die Theorie, aber ich (als Anfänger) habe Schwierigkeiten die Formel  in eine Funktion zu bekommen. Allein das potenzieren mit 2n+1 haut mit pow (zumindest bei mir) nicht hin.


Dann zeige deinen Code. Wie lauten die Fehlermeldungen? Was funktioniert nicht?

Gruß


----------



## 123bz (6. Juni 2011)

Hier mein Quellcode (Microsoft Visual Studio 2008)
#include <iostream>
#include<cmath>
using namespace std;

double myLog (double x, int n)
{
        return ((pow((x-1),(2n+1)/((2n+1)*pow((x+1),(2n+1))));
}


int main()
{

double x;
int n;
int y;
double ln;

cout<<"Bitte einen Wert eingeben: "<<endl;
cin>>x;

cout<<"Bitte Genauigkeit eingeben: "<<endl;
cin>>n;

for (y = 1; y<n; y++)

{
     ln = myLog(x,y);
     y++;
}

cout<<"Logarithmus lautet: "<<ln<<endl;
}

4 Fehlermeldungen in Zeile mit Funktion:
Ungültiges Suffix für Zahl (3x)
Fehlendes ')' vor Bezeichner 'n'


----------



## deepthroat (6. Juni 2011)

Bitte umschließe deinen Code mit [code=cpp]...[/code] Tags. Danke.

Die Schleife muss in die Funktion rein. Und die Schleife ist falsch - die Zahl der Iterationen stimmt nicht. Überlege wieoft die Schleife durchlaufen werden muss für ein bestimmtes _n_. Überprüfe wieoft deine Schleife durchlaufen wird.

Schreibe erstmal nur die Schleife (ohne Inhalt) in der Funktion.

Gehe jede einzelne Frage Schritt für Schritt durch. Du versuchst das Problem mit einem Schlag zu lösen, was sehr schwierig ist. Ich habe dir das Problem eigentlich schon zerlegt, du mußt nur die Teilprobleme lösen. Dazu mußt du noch nicht mal irgendwas programmieren.

Welcher Teil der Summanden ist immer gleich?

Welcher Teil ist variabel? (benenne den Teil doch mal - wie nennt man das denn in der Mathematik?)

Versuche den variablen Teil durch eine Variable zu ersetzen. (nimm einen einzelnen Summanden ersetze den variablen Teil durch deine Variable)

Versuche eine Beziehung zwischen dem Wert der Variablen und der Anzahl der Schleifendurchläufe zu finden. (Tipp: die Bildungsvorschrift steckt schon im letzten Summanden drin)

Gruß


----------



## 123bz (6. Juni 2011)

Erstmal danke für die Geduld und die Hilfe.
Also,
x ist immer gleich also konstant.

also könnte ich (x-1)/(x+1) durch k ersetzen.

somit würde meine Formel ln = 2* ((1/(2n+1))*k^(2n+1)) lauten

Wenn die Benutzereingabe für n z.B. 7 ist, dann wird die Schleife 7 mal durchlaufen.
Startwert 1 , Endwert =<n, bei jedem Durchlauf wird n um 1 erhöht.

Der variable Teil ist 2n+1, diesen habe ich (versucht) mit y zu ersetzen.
y = 2n+1

Und jetzt bin ich komplett verwirrt


----------



## 123bz (6. Juni 2011)

So ich habe es nochmal probiert.
Jetzt bekomme ich keine Fehlermeldungen mehr, die Ausgabe startet aber das Ergebnis ist immer 0.

Was habe ich falsch gemacht?


```
#include < iostream>
 #include <cmath>
   
 using namespace std;

double myLog(double x, int n)
{
    double ln = (2* ((1/ (2*n+1)) * (pow(((x-1)/(x+1)), (2*n+1)))));
   return ln;
}

int main()
{
double x, ln, k;
int n, y;

cout<<"Zahl eingeben: "<<endl;
cin>>x;

cout<<"Genauigkeit eingeben: "<<endl;
cin>>n;

k = (x-1) / (x+1);

for(y = 1; y<= n; y++)
{
   ln = (1/(2*n+1))*pow(k,(2*n+1));
   ln = ln +ln;
   n++;
   y++;
}
cout<<"Logarithmus ist: "<<2*ln<<endl;
}
```


----------



## deepthroat (6. Juni 2011)

123bz hat gesagt.:


> Also, x ist immer gleich also konstant.


Richtig.


123bz hat gesagt.:


> also könnte ich (x-1)/(x+1) durch k ersetzen.


Nein, das würde nicht funktionieren. Du mußt schließlich auch noch auf die math. Regeln achten.

Aber du könntest (x-1) und (x+1) durch andere Variablen ersetzen, damit du nicht immer in der Schleife (x-1) und (x+1) ausrechnen mußt.

Sei also a=(x-1) und b=(x+1).


123bz hat gesagt.:


> somit würde meine Formel ln = 2* ((1/(2n+1))*k^(2n+1)) lauten


Wo sind denn deine ganzen anderen Summanden geblieben?


123bz hat gesagt.:


> Wenn die Benutzereingabe für n z.B. 7 ist, dann wird die Schleife 7 mal durchlaufen.
> Startwert 1 , Endwert =<n, bei jedem Durchlauf wird n um 1 erhöht.


Sehr gut. Vorher hattest du y < n geschrieben, was nicht richtig war.


123bz hat gesagt.:


> Der variable Teil ist 2n+1, diesen habe ich (versucht) mit y zu ersetzen.


Du gehst von der falschen Formel aus bzw. bist wieder zu schnell.

Schreiben wir doch mal ein paar deiner Summanden untereinander und schauen welcher Teil variabel ist...

(a/b)
((a^3)/(3*b^3))
((a^5)/(5*b^5))
((a^5)/(
...
(a^(2n+1))/((2n+1)*b^(2n+1))

Offenbar ist also der variable Teil einmal der Exponent bzw. der Faktor mit dem b multipliziert wird.

Nennen wir den variablen Teil v.

Demnach hat also jeder Summand grundsätzlich die Form:

a ^ v / (v * b ^ v)

Ich hoffe das siehst du auch so?!

Diese Summanden mußt du für 1..n zusammenaddieren. Da ist jetzt nur die Frage, wie berechnest du in jedem Schleifendurchlauf den Wert von v?

Wenn deine Schleifenvariable _y_ heißt, wie berechnest du abhängig von diesem y den Wert von v? Nach welcher Vorschrift?

Bsp: wenn y = 3 ist, welchen Wert hat v?

Und wie gesagt, sollte die Schleife in die Funktion rein:

```
double myLog(double x, int n)
{
  for(int y = 1; y<= n; y++)
  {
     ...
   }
  return ln;
}
```
Gruß


----------



## 123bz (6. Juni 2011)

ist y =v ?
wenn ich für in der Schleife folgendes eingebe, kommt gar kein Wert mehr zurück:

```
for(y=1; y<=n; y++)
{
ln= ((a/b)+((pow(a,v))/(v*(pow(b,v)))));
ln=ln+ln;
v=v+2;
y++;

return ln;
}
```
Die Funktion kommt ja vor der main, kommt die Schleife auch vor die main?


----------



## deepthroat (6. Juni 2011)

123bz hat gesagt.:


> ist y =v ?


y hat einen Wert von 1 bis n.

Wenn du für v also direkt y einsetzt, würde die Formel dann stimmen? ;-]


123bz hat gesagt.:


> wenn ich für in der Schleife folgendes eingebe, kommt gar kein Wert mehr zurück:
> 
> ```
> for(y=1; y<=n; y++)
> ...


Du hast die return Anweisung in die Schleife geschrieben. Und du hast die Formel nicht richtig umgesetzt. Du bist schon wieder zu schnell. Beim Programmieren sind wir doch noch gar nicht.

Allerdings wird auch hier ein Wert zurückgegeben. Vermutlich hast du in main einen Fehler beim Aufruf gemacht... \edit: Du hast vermutlich die Schleife immer noch in main. Durch das return wird das Programm direkt beendet.


123bz hat gesagt.:


> Die Funktion kommt ja vor der main, kommt die Schleife auch vor die main?


Die Schleife muss in die Funktion rein. Da wo die Funktion definiert ist, ist auch die Schleife. Ich habe dir doch bereits das Grundgerüst für die Funktion hingeschrieben...

Gruß


----------

