Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
1

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

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

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


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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2015, 10:27
Ответы с готовыми решениями:

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

Рекурсивная функция для вычисления суммы ряда
#include &lt;iostream&gt; #include&lt;cmath&gt; int sum(int a); int main() { int n; std::cout &lt;&lt; &quot;Enter...

Рекурсивная функция вычисления суммы знакопеременного ряда
Написать рекурсивную функцию для вычисления суммы : S = 1 -1/2 + 1/4 -1/8+1/16 -1/32.., функцию pow...

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

16
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
06.10.2015, 10:34 2
C++
1
2.0/(2*n-1.0)
1
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
06.10.2015, 10:34 3
1.
Цитата Сообщение от Sibmax1988 Посмотреть сообщение
2/(2*n-1)
это целочисленное деление, оно и дает нуль

2.Вычисление функций разложением в ряд Тейлора
1
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
06.10.2015, 10:36 4
2)для нахождения каждого элемента ряда я использую функцию pow, можно ли как то сделать без ее помощи как то видоизменив или преобразовав ряд?
Переменную добавить и домножать ее, а потом на неё.
0
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
06.10.2015, 10:36  [ТС] 5
ture, почему тогда первый раз отрабатывает?
И согласно правилам приведения типов достаточно чтобы хотя бы один операнд выражения был double
не могу понять почему первый раз отрабатывает а второй нет
хотя 2. помогло
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
06.10.2015, 10:37 6
Sibmax1988, обратите внимание на порядок вычислений.
Сначала идет деление целого на целое, а уж потом умножение на действительное.
0
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
06.10.2015, 10:38  [ТС] 7
Переменную добавить и домножать ее, а потом на неё.
не понял?
0
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
06.10.2015, 10:39 8
Sibmax1988, первый раз целочисленное деление дает 1, вот и прокатывает.
0
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
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
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
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)

У вас рекуррентная формула такая
https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n}={a}_{n-1}\frac{(2n-1){z}^{2}}{2n+1}
https://www.cyberforum.ru/cgi-bin/latex.cgi?z=\frac{x-1}{x+1}
a0=2z
Причем x>1. Т.е. его не надо приводить к интервалу (0,1)
0
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
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
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
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
https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n+1}={a}_{n}\frac{(2n+1)(2n+2){z}^{2}}{2n+3}
или
https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n}={a}_{n-1}\frac{(2n-1)(2n){z}^{2}}{2n+1}
https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{1}=\frac{{x}^{3}}{6}
И начинайте с s=x
1
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
06.10.2015, 11:36  [ТС] 13
zss, а откуда подряд дроби берутся в условии у arcsin?
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
06.10.2015, 11:43 14
https://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
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
06.10.2015, 12:23  [ТС] 15
zss, вообще не могу допереть
даже когда формулы написано
пытаюсь в ручную посчитать даже первый член ряда получить не могу
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
06.10.2015, 12:44 16
что же тут сложного. Берем n=1: 2n-1=1, (2n)(2n+1)=2*3=6
0
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2015, 12:57
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru