Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Sibmax1988
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 121
1

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

06.10.2015, 10:27. Просмотров 985. Ответов 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
Ответы с готовыми решениями:

Рекурсивная функция для вычисления суммы ряда
помогите вычислить сумму с использованием рекурсивной функции. Программу...

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

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

вычисления суммы ряда
Написать программу для вычисления суммы...

Вычисления суммы ряда
И так дамы и господа, немного запутался с решением задач по лабораторной работе...

16
ture
528 / 336 / 206
Регистрация: 27.11.2014
Сообщений: 1,043
06.10.2015, 10:34 2
C++
1
2.0/(2*n-1.0)
1
zss
Модератор
Эксперт С++
7182 / 6679 / 4228
Регистрация: 18.12.2011
Сообщений: 17,627
Завершенные тесты: 1
06.10.2015, 10:34 3
1.
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
2/(2*n-1)
это целочисленное деление, оно и дает нуль

2.Вычисление функций разложением в ряд Тейлора
1
ture
528 / 336 / 206
Регистрация: 27.11.2014
Сообщений: 1,043
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
Модератор
Эксперт С++
7182 / 6679 / 4228
Регистрация: 18.12.2011
Сообщений: 17,627
Завершенные тесты: 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
528 / 336 / 206
Регистрация: 27.11.2014
Сообщений: 1,043
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
Модератор
Эксперт С++
7182 / 6679 / 4228
Регистрация: 18.12.2011
Сообщений: 17,627
Завершенные тесты: 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
Модератор
Эксперт С++
7182 / 6679 / 4228
Регистрация: 18.12.2011
Сообщений: 17,627
Завершенные тесты: 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
Модератор
Эксперт С++
7182 / 6679 / 4228
Регистрация: 18.12.2011
Сообщений: 17,627
Завершенные тесты: 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
zss
Модератор
Эксперт С++
7182 / 6679 / 4228
Регистрация: 18.12.2011
Сообщений: 17,627
Завершенные тесты: 1
06.10.2015, 12:44 16
что же тут сложного. Берем n=1: 2n-1=1, (2n)(2n+1)=2*3=6
0
Sibmax1988
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 121
06.10.2015, 12:57  [ТС] 17
zss, ряд начинается x+1/2*1*3*x^3 вот это получить не могу даж
если что x (от 0,1 до 0,9)
т е первые два члена ряда высчитать не могу в книге еще вот так написано

В вариантах 3, Bn - числа Бернулли, использовать в виде следующего массива значений для n = 1..11.
.
1 1 1 1 5 691 7 3617 43867 174611 854513
-, --, --, --, --, ----, -, ----, -----, -------, ------
6 30 42 30 66 2730 6 510 798 330 138]

Добавлено через 6 минут
В вариантах 3, Bn - числа Бернулли, использовать в виде следующего массива значений для n = 1..11.
.


1/6, 1/30, 1/42, 1/30, 5/66,691,2730, 7/6, 3617/510, 43867/798, 174611/330, 854513/138

Добавлено через 19 секунд
0
06.10.2015, 12:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2015, 12:57

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

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

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


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

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

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