C++ Logarithmus Funktion

123bz

Grünschnabel
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
 
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ß
 
Zuletzt bearbeitet:
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.
 
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.
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ß
 
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'
 
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ß
 
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:(
 
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?

Code:
#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;
}
 
Also, x ist immer gleich also konstant.
Richtig.
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).
somit würde meine Formel ln = 2* ((1/(2n+1))*k^(2n+1)) lauten
Wo sind denn deine ganzen anderen Summanden geblieben?
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.
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:
C:
double myLog(double x, int n)
{
  for(int y = 1; y<= n; y++)
  {
     ...
   }
  return ln;
}
Gruß
 
ist y =v ?
wenn ich für in der Schleife folgendes eingebe, kommt gar kein Wert mehr zurück:
Code:
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?
 
Zurück