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

Где-то допустил ошибку (решение интегралов методов Симпсона) - C++

Восстановить пароль Регистрация
 
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
18.12.2012, 16:58     Где-то допустил ошибку (решение интегралов методов Симпсона) #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<math.h>
#include<iomanip>
using namespace std;
int main()
{
    int x,a,b,h,c,g1,g2,f=0;
    cout<<"Vvedite a,b,h"<<endl;
    cin>>a>>b>>h;
    float n=(static_cast<float>(b-a))/h;
    for (int i=0;i<=n;i++)
    {
    x=a+i*h;
    f=(x*x+1);
    if ((i==0) || (i==n))
        c=f+c;
        else
        if (i%2==0)
        g2=f+g2;
    else
        g1=g1+f;
 
    }
    float sum=(static_cast<float>(h)/3)*(c+4*g1+2*g2);
    cout<<fixed;
cout<<setprecision(3);
cout<<"Otvet"<<" "<<sum<<endl;
 
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2012, 16:58     Где-то допустил ошибку (решение интегралов методов Симпсона)
Посмотрите здесь:

допустил ошибку, в перезагрузке операций C++
C++ Решение системы СЛАУ одним из методов Гаусса: исправить код
C++ Не могу понять, как исправить ошибку в при вызове методов класса
Здравствуйте, подскажите пожалуйста, где я допустил ошибку(При вынесении кода в отдельную функцию, выдает ошибки) C++
C++ Найти ошибку в программе. Интеграл по формуле Симпсона,
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11807 / 6786 / 767
Регистрация: 27.09.2012
Сообщений: 16,839
Записей в блоге: 2
Завершенные тесты: 1
18.12.2012, 17:04     Где-то допустил ошибку (решение интегралов методов Симпсона) #2
Цитата Сообщение от iluxa1810 Посмотреть сообщение
C++
1
2
3
4
if (i%2==0) 
  g2=f+g2; 
else 
  g1=g1+f;
g1 и g2 на при первом использовании не инициализированы
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
18.12.2012, 17:08  [ТС]     Где-то допустил ошибку (решение интегралов методов Симпсона) #3
Цитата Сообщение от Croessmah Посмотреть сообщение
g1 и g2 на при первом использовании не инициализированы
В каком смысле?
Я же всем переменным в начале 0 присвоил ...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11807 / 6786 / 767
Регистрация: 27.09.2012
Сообщений: 16,839
Записей в блоге: 2
Завершенные тесты: 1
18.12.2012, 17:20     Где-то допустил ошибку (решение интегралов методов Симпсона) #4
Цитата Сообщение от iluxa1810 Посмотреть сообщение
Я же всем переменным в начале 0 присвоил ...
Где?
C++
1
int x,a,b,h,c,g1,g2,f=0;
Здесь?
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
18.12.2012, 20:13  [ТС]     Где-то допустил ошибку (решение интегралов методов Симпсона) #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Где?

Здесь?
да .

Добавлено через 2 часа 26 минут
Помогите

Добавлено через 21 минуту
Суть метода:
Допустим нам дан определенный интеграл с пределами интегрирования от 2(это a) до 11(это b) (x^2+1)dx
и шаг 2(h).
Теперь нам надо найти кол-во шагов по формуле n=(b-a)/h
Далее мы находим иксы по формуле xi=a+i*h ,что бы найти Ii надо подставить полученный xi в функцию(в данном случае это x^2+1) .
Далее мы находим g1 =это сумма I от 1 до n-1(Сумма не четных ишек)
g2=это сумма от 2 до n-2(Сумма четных ишек)
Потом подставляем в эту формулу h/3(I0+In+4g1+2g2)
И получаем ответ .
Думаю все нормально объяснил.

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<math.h>
#include<iomanip>
using namespace std;
int main()
{
    int x,a,b,h,c,g1,g2,f=0;
    cout<<"Vvedite a,b,h"<<endl;
    cin>>a>>b>>h;
    float n=(static_cast<float>(b-a))/h;
    for (int i=0;i<=n;i++)
    {
    x=a+i*h;
    f=(x*x+1);
    if ((i==0) || (i==n)) //Если i =0 или i=n ,то высчитываем их сумму отдельно
        c=f+c;
        else
        if (i%2==0) //Проверяем i на четность
        g2=f+g2; //если четная то прибавляем f к g2
    else
        g1=g1+f; //Если не четная ,то прибавляем f к g1
 
    }
    float sum=(static_cast<float>(h)/3)*(c+4*g1+2*g2);//Подставляем в формулу
    cout<<fixed;
cout<<setprecision(3);
cout<<"Otvet"<<" "<<sum<<endl;//Получаем ответ
 
 
    return 0;
}
Добавлено через 2 минуты
Где-то какая-то мелкая ошибка ,которая не бросается в глаза...
Дмитрий 93
74 / 59 / 5
Регистрация: 03.06.2011
Сообщений: 309
18.12.2012, 20:18     Где-то допустил ошибку (решение интегралов методов Симпсона) #6
C++
1
2
3
{
    int x,a,b,h,c,g1=0,g2=0,f=0;
    cout<<"Vvedite a,b,h"<<endl;
_andrew_
22 / 22 / 3
Регистрация: 14.11.2012
Сообщений: 64
18.12.2012, 20:19     Где-то допустил ошибку (решение интегралов методов Симпсона) #7
Croessmah чертовски прав)
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
36
37
38
39
#include<iostream>
#include<math.h>
#include<iomanip>
#include<conio.h>
using namespace std;
int main()
{
    int x=0;
    int a=0;
    int b=0;
    int h=0;
    int c=0;
    int g1=0;
    int g2=0;
    int f=0;
    cout<<"Vvedite a,b,h"<<endl;
    cin>>a>>b>>h;
    float n=(static_cast<float>(b-a))/h;
    for (int i=0;i<=n;i++)
    {
    x=a+i*h;
    f=(x*x+1);
    if ((i==0) || (i==n))
        c=f+c;
        else
        if (i%2==0)
        g2=f+g2;
    else
        g1=g1+f;
 
    }
    float sum=(static_cast<float>(h)/3)*(c+4*g1+2*g2);
    cout<<fixed;
cout<<setprecision(3);
cout<<"Otvet"<<" "<<sum<<endl;
 
 getch();
    return 0;
}
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
18.12.2012, 20:29  [ТС]     Где-то допустил ошибку (решение интегралов методов Симпсона) #8
Цитата Сообщение от Дмитрий 93 Посмотреть сообщение
C++
1
2
3
{
    int x,a,b,h,c,g1=0,g2=0,f=0;
    cout<<"Vvedite a,b,h"<<endl;
А разве если через запятую написать,а в конце = 0 ,то не вся строка к 0 прировняется?

Добавлено через 7 минут
Цитата Сообщение от _andrew_ Посмотреть сообщение
Croessmah чертовски прав)
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
36
37
38
39
#include<iostream>
#include<math.h>
#include<iomanip>
#include<conio.h>
using namespace std;
int main()
{
    int x=0;
    int a=0;
    int b=0;
    int h=0;
    int c=0;
    int g1=0;
    int g2=0;
    int f=0;
    cout<<"Vvedite a,b,h"<<endl;
    cin>>a>>b>>h;
    float n=(static_cast<float>(b-a))/h;
    for (int i=0;i<=n;i++)
    {
    x=a+i*h;
    f=(x*x+1);
    if ((i==0) || (i==n))
        c=f+c;
        else
        if (i%2==0)
        g2=f+g2;
    else
        g1=g1+f;
 
    }
    float sum=(static_cast<float>(h)/3)*(c+4*g1+2*g2);
    cout<<fixed;
cout<<setprecision(3);
cout<<"Otvet"<<" "<<sum<<endl;
 
 getch();
    return 0;
}
Спасибо,все работает .
Дмитрий 93
74 / 59 / 5
Регистрация: 03.06.2011
Сообщений: 309
18.12.2012, 20:35     Где-то допустил ошибку (решение интегралов методов Симпсона) #9
Цитата Сообщение от iluxa1810 Посмотреть сообщение
А разве если через запятую написать,а в конце = 0 ,то не вся строка к 0 прировняется?
с чего бы это? присваивание нулю это a=0, перечисление переменных заданного типа через запятую идет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2012, 20:55     Где-то допустил ошибку (решение интегралов методов Симпсона)
Еще ссылки по теме:

C++ Где размещать реализацию методов класса?
Не могу найти ошибку в коде (Численное интегрирование методом Симпсона) C++
C++ Найдите ошибку (Формула Симпсона)

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

Или воспользуйтесь поиском по форуму:
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
18.12.2012, 20:55  [ТС]     Где-то допустил ошибку (решение интегралов методов Симпсона) #10
А еще вопрос .Вот я пересчитал в ручную от 2(это a) до 11(это b) (x^2+1)dx и получил ровно 400 ,
а программа выдает 386.667 . Почему?

Добавлено через 9 минут
Прога считает правильно,я обсчитался на 12 .
Все спасибо .
Yandex
Объявления
18.12.2012, 20:55     Где-то допустил ошибку (решение интегралов методов Симпсона)
Ответ Создать тему
Опции темы

Текущее время: 17:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru