Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Метод Симпсона три восьмых

52K
10 апреля 2012 года
Пав
11 / / 17.12.2009
Код:
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <locale.h>
#include <math.h>
using namespace std;
float Y(double p);

int main()
{
        setlocale(LC_CTYPE,"Russian");
       
            double x, a, b, h, s,i;
            int n;
            cout<<"Отрезок интегрирования [a,b] --> (a) =\n";
            cin>>a;
           cout<<"Отрезок интегрирования [a,b] --> (b) =\n";
            cin>>b;
                       cout<<"число разбиений --> (n) =\n";
                       cin>>n;

           

            h = (b - a)/ (2*n);
            cout<<"H="<<h;
            s = 0; x = a + h;
            while (x < b)        
            {
                s = s + 2 * Y(x);
                x = x + h;
                s = s + 3 * Y(x);
                x = x + h;
            }
            s = (3*h)/ 8 * ( s + Y(a) + Y(b));
            cout<<"Интеграл = {0}"<<s;
           
}
float Y(double p)
{
return 1/(1+p*p);
}

Собственно вычислить надо интеграл по заданным в ручную границам
методом Симпсона Три восьмых
интеграл: 1/(1+p*p);

Прога дает не очень точный результат подскажите пути решения
желательно сразу наглядно чтоб меньше возникало вопросов)))
Спасибо
72K
10 апреля 2012 года
CorsaiR
59 / / 07.03.2012
По - моему у вас есть ошибки в реализации метода.
Попробуйте так:
Код:
h = (b - a)/ (3*n);
cout<<"H="<<h;
s = Y(a)+Y(b);
//x = a + h;
for (int i = 1; i<= 3*n-1; i++)            
{
    x = a +h*i;
    if (i%3 == 0)
        s = s + 2*Y(x);
    else
        s = s + 3 * Y(x);
}

s = (3/8) * s * h;
cout<<"Интеграл = {0}"<<s;
52K
25 апреля 2012 года
Пав
11 / / 17.12.2009
Цитата: CorsaiR
По - моему у вас есть ошибки в реализации метода.
Попробуйте так:
Код:
h = (b - a)/ (3*n);
cout<<"H="<<h;
s = Y(a)+Y(b);
//x = a + h;
for (int i = 1; i<= 3*n-1; i++)            
{
    x = a +h*i;
    if (i%3 == 0)
        s = s + 2*Y(x);
    else
        s = s + 3 * Y(x);
}

s = (3/8) * s * h;
cout<<"Интеграл = {0}"<<s;





еще раз пробежался и понял косяк я да да
в строке ошибся Я поставив скобки

 
Код:
for (int i = 1; i<= 3*       (n-1)              ; i++)
без них все работает
Вот полный рабочий текст на новом примере результатом должно быть 8,75

Код:
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <locale.h>
#include <math.h>
using namespace std;
long double Y(double p);

int main()
{
        setlocale(LC_CTYPE,"Russian");
       
            long double x, a, b, h, s,i,n,m;
           
            cout<<"Отрезок интегрирования [a,b] --> (a) =\n";
            cin>>a;
           cout<<"Отрезок интегрирования [a,b] --> (b) =\n";
            cin>>b;
                       cout<<"число разбиений --> (n) =\n";
                       cin>>n;

           
h = ((b - a)/ (3*n)); cout<<"\nH="<<h;
s = Y(a)+Y(b);
m=3*n-1;

    for (int i = 1; i<= m; i++)            
            {
                x = a + h*i;
                if (i%3 == 0)
                    s = s + 2 * Y(x);
                else
                    s = s + 3 * Y(x);
            }

s = s*3/8*h;

cout<<"\nИнтеграл = "<<s<<"\n";
           
}
long double Y(double p)
{
return  ((p*p*p)+ (3*p*p)-2);
}
52K
25 апреля 2012 года
Пав
11 / / 17.12.2009
прям интересно за что начинающему минус
75K
10 апреля 2012 года
zitxbit
43 / / 03.04.2012
Вместо float и double используйте long double
52K
10 апреля 2012 года
Пав
11 / / 17.12.2009
Спасибо завтра опробую с вашими предложениями и вылажу результат
52K
25 апреля 2012 года
Пав
11 / / 17.12.2009
Руки все никак не доходили)))Сделал с вашими советами результат все равно очень не точный((((
Препод сказал что именно в цикле и есть ошибка а где не говорит(((
52K
25 апреля 2012 года
Пав
11 / / 17.12.2009
Давайте решим уже проблему просмотров уже почти три сотни с учетом специфики данного задания очень много кому интересно решение
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог