Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Sibmax1988
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 121
#1

Функция вычисления суммы ряда ln(x) - C++

06.10.2015, 10:27. Просмотров 708. Ответов 16
Метки нет (Все метки)

Здравствуйте поставили задачу написать программу на вычисление суммы ряда вида


z=((x-1)/(x+1)) (2/1)z + (2/3)z^3+...+ (2/2n-1)z^ 2n-1 где z=(x-1)/(x+1)
В связи с этим возникло два вопроса:
1) Написал программу вида:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <locale.h>
#include <math.h>
using namespace std;
double sum (double x, double eps)
{
double s=0,sn=1.,z;
int n=1;
z=(x-1)/(x+1);
for (s=0., sn=1,n=1;fabs(sn)>eps;n++)
{
    sn=2/(2*n-1)*pow (z,(2*n-1));
    s+=sn;   
}
 
return s;
}
int main () 
{
    double x;
    for (x=0.1;x<=1.;x+=0.1)
        cout<<"x="<<x<<" sum="<<setprecision(4)<<sum(x,0.0001)<<" Ln(x)= "<<setprecision(4)<<log(x)<<endl;
    
    getch();
    return 0;
}
но при вызове функции когда начинает выполняться цикл в ней то на втором шаге цикла переменая sn перестает считаться ей присваивается 0 и выходит из цикла.Вопрос: почему так происходит
и вопрос номер 2
2)для нахождения каждого элемента ряда я использую функцию pow, можно ли как то сделать без ее помощи как то видоизменив или преобразовав ряд?

Добавлено через 32 минуты
прошу помощи
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2015, 10:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция вычисления суммы ряда ln(x) (C++):

Рекурсивная функция вычисления суммы бесконечного ряда - C++
Всем привет) Объясните кто нибудь как это можно сделать?)

Функция для вычисления суммы члена ряда. Не могу найти ошибку - C++
Условие: Разработать функцию для вычисления члена ряда: (-1)^n/(n+1)! Используя разработанную функцию вычислить сумму ряда с позиции N...

вычисления суммы ряда - C++
Написать программу для вычисления суммы ряда(http://www.cyberforum.ru/attachments/265151d1368049193) с заданной точностью для заданного -1...

Вычисления суммы ряда - C++
И так дамы и господа, немного запутался с решением задач по лабораторной работе для техникума. Нуждаюсь в вашей помощи. Задание: ...

Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известно количество N членов ряда. - C++
Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известно количество N членов ряда. Сума...

Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известно количество N членов ряда. - C++
Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известно количество N членов ряда. ...

16
ture
442 / 335 / 127
Регистрация: 27.11.2014
Сообщений: 1,042
06.10.2015, 10:34 #2
C++
1
2.0/(2*n-1.0)
1
zss
Модератор
Эксперт С++
6636 / 6198 / 2051
Регистрация: 18.12.2011
Сообщений: 16,159
Завершенные тесты: 1
06.10.2015, 10:34 #3
1.
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
2/(2*n-1)
это целочисленное деление, оно и дает нуль

2.Вычисление функций разложением в ряд Тейлора
1
ture
442 / 335 / 127
Регистрация: 27.11.2014
Сообщений: 1,042
06.10.2015, 10:36 #4
2)для нахождения каждого элемента ряда я использую функцию pow, можно ли как то сделать без ее помощи как то видоизменив или преобразовав ряд?
Переменную добавить и домножать ее, а потом на неё.
0
Sibmax1988
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 121
06.10.2015, 10:36  [ТС] #5
ture, почему тогда первый раз отрабатывает?
И согласно правилам приведения типов достаточно чтобы хотя бы один операнд выражения был double
не могу понять почему первый раз отрабатывает а второй нет
хотя 2. помогло
0
zss
Модератор
Эксперт С++
6636 / 6198 / 2051
Регистрация: 18.12.2011
Сообщений: 16,159
Завершенные тесты: 1
06.10.2015, 10:37 #6
Sibmax1988, обратите внимание на порядок вычислений.
Сначала идет деление целого на целое, а уж потом умножение на действительное.
0
Sibmax1988
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 121
06.10.2015, 10:38  [ТС] #7
Переменную добавить и домножать ее, а потом на неё.
не понял?
0
ture
442 / 335 / 127
Регистрация: 27.11.2014
Сообщений: 1,042
06.10.2015, 10:39 #8
Sibmax1988, первый раз целочисленное деление дает 1, вот и прокатывает.
0
Sibmax1988
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 121
06.10.2015, 10:44  [ТС] #9
zss, почему тогда первый раз отрабатывает без проблем?

Добавлено через 2 минуты
ture, вы правы
тогда остается ответ на второй вопрос
в книге написано что если преобразовать ряд к виду
y =(((...(((An*x + An-1)*x + An-2)*x +...+ A1)*x+A0 и потом делать итерацию то так будет правильнее с точки зрения затрат памяти времени и т п и что такой подход избавит от постоянного возведения в степень
а как мне так сделать если число n то я не знаю?

Добавлено через 2 минуты
double my_ln (double x)
{
const double eps=1e-6;
const double lnln=M_LN2; //ln2
int k=0;
while(x>2.0)
{
x/=2.0;
k++;
}
x-=1.;
double s=0;
int n=1;
double an=x;
while (fabs(an)>eps)
{
s+=an;
++n;
an*=-x*(n-1)/n;
}
s+=k*lnln;
return s;
}
Цитата Сообщение от zss Посмотреть сообщение
2.Вычисление функций разложением в ряд Тейлора
код не особо понятен если честно точнее алгоритм

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
double my_ln (double x)
{
    const double eps=1e-6;
    const double lnln=M_LN2; //ln2
    int k=0;
    while(x>2.0)
    { 
        x/=2.0;
        k++;
    }
    x-=1.;
    double s=0;
    int n=1;
    double an=x;
    while (fabs(an)>eps)
    {
        s+=an;
        ++n;
        an*=-x*(n-1)/n;
    }
    s+=k*lnln;
    return s;
}
0
zss
Модератор
Эксперт С++
6636 / 6198 / 2051
Регистрация: 18.12.2011
Сообщений: 16,159
Завершенные тесты: 1
06.10.2015, 11:09 #10
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
an*=-x*(n-1)/n;
Это как раз и означает, что an=an-1*(-1)*x*(n-1)/n
a1=x
Разложение отлично от Вашего, т.к. разлагается ln(1+x) (Обратите внимание на строку x-=1.
А первый цикл whlie использутеся для того, чтобы привести аргумент к диапазону <0<x<1 используя формулу
ln(2kx)=k*ln2*ln(x)

У вас рекуррентная формула такая
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n}={a}_{n-1}\frac{(2n-1){z}^{2}}{2n+1}
http://www.cyberforum.ru/cgi-bin/latex.cgi?z=\frac{x-1}{x+1}
a0=2z
Причем x>1. Т.е. его не надо приводить к интервалу (0,1)
0
Sibmax1988
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 121
06.10.2015, 11:21  [ТС] #11
zss, все равно ничего не понял

препод помешан на рядах теперь вообще надо еще и arcsin итерацией посчитать
а там ряд вообще дьявольский не понятно как строится


x +1/2*1/3*x^3 +...+ 1/2*3/4*5*6...(2n-1) /(2n(2n+1))*x^(2n+1)

Добавлено через 6 минут
говорит что с помощью чисел Бернулли надо как то решать
0
zss
Модератор
Эксперт С++
6636 / 6198 / 2051
Регистрация: 18.12.2011
Сообщений: 16,159
Завершенные тесты: 1
06.10.2015, 11:33 #12
Вот так будет с Вашим разложением
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
double my_ln (double x)
{
     if(x<1)
        return 0;
    const double eps=1e-6;
    double s=0;
    int n=0;
    double an=2.*x;
    double z =(x-1.)/(x+1.);
    while (fabs(an)>eps)
    {
        s+=an;
        ++n;
        an*=z*z*(2.*n-1.)/(2.*n+1);
    }
    return s;
}

Для arcsin
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n+1}={a}_{n}\frac{(2n+1)(2n+2){z}^{2}}{2n+3}
или
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n}={a}_{n-1}\frac{(2n-1)(2n){z}^{2}}{2n+1}
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{1}=\frac{{x}^{3}}{6}
И начинайте с s=x
1
Sibmax1988
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 121
06.10.2015, 11:36  [ТС] #13
zss, а откуда подряд дроби берутся в условии у arcsin?
0
zss
Модератор
Эксперт С++
6636 / 6198 / 2051
Регистрация: 18.12.2011
Сообщений: 16,159
Завершенные тесты: 1
06.10.2015, 11:43 #14
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n}=\frac{1*3*5*..*(2n-1){x}^{2n+1}}{2*4*6*...*(2n)*(2n+1)}
Подставьте сюда n+1 вместо n и для того, чтобы вычленить an Вам понадобится домножить числитель и знаменатель на 2n+1
0
Sibmax1988
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 121
06.10.2015, 12:23  [ТС] #15
zss, вообще не могу допереть
даже когда формулы написано
пытаюсь в ручную посчитать даже первый член ряда получить не могу
0
06.10.2015, 12:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2015, 12:23
Привет! Вот еще темы с ответами:

Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известно количество N членов ряда. - C++
Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известно количество N членов ряда. ...

Рекурсия для вычисления суммы ряда - C++
Используя рекурсивный вызов функции вычислить с заданной точностью сумму ряда: 2/3+4/9+6/27+8/81+... (GUI)

Программа для вычисления суммы ряда - C++
Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известна количество N членов ряда. ...

Программа для вычисления суммы ряда - C++
Нужно написать программу для вычисления суммы ряда. Формулы надо переписывать внутрь сообщения. Редактор формул - внизу окна.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.