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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
Vidok
37 / 37 / 2
Регистрация: 03.09.2011
Сообщений: 279
#1

Интеграл Гаусса в ряд - C++

14.10.2011, 14:40. Просмотров 2324. Ответов 5
Метки нет (Все метки)

Помогите запрограммировать интеграл Гаусса за разложением его в ряд.
Интеграл Гаусса в ряд
Наброски сделал, но не знаю правильно ли.

C++
1
2
3
4
5
6
7
8
9
10
double gauss(double x) 
{   double t=x,k=1,s=t,f=1,i=1,eps=0.000000001;
do {
    f=f*i;
    k=k+2; t=-t*x*x/k*f;
    s=s+t;
    i++;
}while(t>eps);
return s;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2011, 14:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Интеграл Гаусса в ряд (C++):

Определённый интеграл методом Гаусса - C++
Составить программу вычисления определенного интеграла с автоматическим выбором шага интегрирования. Расчет интеграла различными методами,...

Вычислить двойной интеграл методом Гаусса - C++
Неправильный результат выдаёт. Помогите найти в чём ошибка. (Visual C++ 2008) #include "stdafx.h" #include <iostream> #include...

Вычисление приближенного значения tan(x) через ряд Тейлора/ряд Маклорена - C++
Привет, CF. Задача: Вычисление приближенного значения tan(x) через ряд Тейлора/ряд Маклорена Проблема: не совпадают результаты...

вычислить функцию с помощью разложения в ряд.(Ряд Тейлора) - C++
Нужно написать программу по Ряду Тейлора.

Вычисление функции через разложение в ряд (Ряд Тейлора) - C++
Привет всем. Задание такого плана: Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора,...

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

5
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
14.10.2011, 15:00 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
вот тут
C++
1
t=-t*x*x/k*f;
вместо деления на факториал f умножаешь на него
и строка s=s+t; должна быть первой в цикле, иначе ты не прибавляешь первое слагаемое никогда

твое слагаемое t меняет знак и если ты сравниваешь с точностью именно его, а не модуль, то цикл закончится на первом же проходе (любое отрицательное число < eps)

вот так можно вычислить с использованием общего рекуррентного множителя данную формулу, если использовать запись ряда вида http://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{i=0}^{\propto} \frac{{(-1)}^{i}{x}^{2i+1} }{(2i+1) i!}

C++
1
2
3
4
5
6
7
8
9
10
double gauss(double x) 
{       
    double t=x,i=0,eps=0.000000001, s=0;
    do {
        s+=t;
        t*=-x*x*(2*i+1)/(2*i+3)/(i+1);     
        i++;
}while(fabs(t)>eps);
return s;
}
0
-=ЮрА=-
Заблокирован
Автор FAQ
14.10.2011, 15:36 #3
aeshes,
Цитата Сообщение от aeshes Посмотреть сообщение
double t=x,i=0,eps=0.000000001, s=0;
* * do {
* * * * s+=t;
* * * * t*=-x*x*(2*i+1)/(2*i+3)/(i+1); * *
* * * * i++;
- ну и где же здесь (-1)^i ???
да и это некорректно
Цитата Сообщение от aeshes Посмотреть сообщение
*(2*i+1)
по вашему x^(2*i+1) = x^2*(2*i + 1) может всё-таки pow(x,2*i + 1) надо, м???!

Добавлено через 9 минут
Цитата Сообщение от aeshes Посмотреть сообщение
while(fabs(t)>eps)
- такое условие окончания не означает
Цитата Сообщение от aeshes Посмотреть сообщение
с точностью именно его
нужно брать разность | X[i + 1] - X[i] | < eps
Точность - это разность между соседними членами!
0
-=ЮрА=-
Заблокирован
Автор FAQ
14.10.2011, 16:27 #4
Вот моя Си реализация
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
32
33
34
35
#include <stdio.h>
#include <math.h>
 
double gauss(double x, double eps)
{
    long i = 1;
    double xi   = x;
    double xi_1 = (-1)*x*x*(xi/1.0*i)*(2*(i - 1) + 1.0)/(2*i + 1.0);
    double sum = xi;
    double buf = fabs(xi_1 - xi);
    while((i++) && eps < fabs(xi_1 - xi))
    {
        sum  += xi_1;
        xi   =  xi_1;
        xi_1 *= (-1)*(x*x)*(xi/1.0*i)*(2*(i - 1) + 1.0)/(2*i + 1.0);
        printf("%d: %lf\n",i, (buf = fabs(xi_1 - xi)));
    }
    return sum;
}
 
int main()
{
    double x = 0, eps = 0;
    int iMENU = 1;
    do
    {
        printf("Enter x : ");scanf("%lf",&x);
        printf("Enter e : ");scanf("%lf",&eps);
        printf("ANSWER  : %lf\n",gauss(x, eps));
        printf("Enter 1 for new input : ");
        scanf("%d",&iMENU);
    }
    while(iMENU == 1);
    return 0;
}
0
Миниатюры
Интеграл Гаусса в ряд  
-=ЮрА=-
Заблокирован
Автор FAQ
14.10.2011, 16:30 #5
aeshes, прошу прощения за своё это выссказывание
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- ну и где же здесь (-1)^i ???
да и это некорректно
Сообщение от aeshes
*(2*i+1)
по вашему x^(2*i+1) = x^2*(2*i + 1) может всё-таки pow(x,2*i + 1) надо, м???!
- я понял что вы каждый раз домножение элемента использовали, однако на счёт стоп условия

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(fabs(t)>eps)
- такое условие окончания не означает
Сообщение от aeshes
с точностью именно его
нужно брать разность | X[i + 1] - X[i] | < eps
Точность - это разность между соседними членами!
- всё в силе
0
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
14.10.2011, 16:54 #6
-=ЮрА=-, я использую следующее окончание вычислительного процесса для рядов: если текущее слагаемое по модулю меньше эпсилон, то можно вычисления заканчивать. Это типичное условие при вычислении сходящихся рядов, у которых каждое следующее слагаемое меньше предыдущего по модулю. А этот ряд сходится. t - собственно слагаемое. А точность - это разность между соседними значениями суммы

Разность между двумя членами имеет смысл проверять, если нет уверенности в сходимости ряда, но тогда собственно нужно еще ограничение на максимальное число итераций, потому что в расходящемся ряде ни мое, ни ваше условие может не выполниться. Например, ряд http://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{i=0}^{\propto } {x}^{i} при х=1, при вашем условии закончит вычисления на второй итерации (первое слагаемое =1, второе слагаемое равно 1, разность равна 0, точность достигнута). При моем условии вообще не остановится, потому что при х=1 расходится, слагаемые к нулю не стремятся. Поэтому, по-хорошему, нужно сочетать одно из условий окончания вычисления с проверкой на максимально допустимое число итераций

Это не претензия, просто делюсь тем, чему нас учили в универе
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2011, 16:54
Привет! Вот еще темы с ответами:

метод Гаусса - C++
Знаю что тема поднималась много раз но все же, можете продемонстрировать решение хотя бы 3 уравнений (желательно 4) но без считывания и...

Метод Гаусса в С++ - C++
Подскажите please, как запустить эту программу, через C++??? Решение системы линейных уравнений методом Гаусса. #include&lt;io.h&gt; ...

метод Гаусса - C++
Помогите пожалуйста написать программу на С++ Задана система линейного уравнения:MA*X=B. Для решения уравнения использовать метод Гаусса

Метод Гаусса - C++
Добрый вечер, можете написать программу для решения СЛАУ методом гаусса на Си, чтобы был прямой и обратный ход.


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

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
14.10.2011, 16:54
Ответ Создать тему
Опции темы

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