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

Нахождение интеграла методом Симпсона - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 197, средняя оценка - 4.97
~DWORD~
 Аватар для ~DWORD~
3 / 3 / 0
Регистрация: 13.10.2009
Сообщений: 10
13.10.2009, 00:12     Нахождение интеграла методом Симпсона #1
[IMG]http://i016.***********/0910/b7/f79e34604977.jpg[/IMG]

имеется функция
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
double Simpson(double (*Fx)(double))
{
        double I;
        double h;
        double x;
        double a,b;
        int m;
        
 
        cout << "\n Input integral atributes:\n" << endl;
        cout << "\t-> Enter a = ";
        cin >> a;
 
        cout << "\t-> Enter b = ";
        cin >> b;
 
        cout << "\t-> Enter m = ";
        cin >> m;
 
        h=(b-a)/(m-1);
        x = a;
 
        I = Fx(a) + Fx(b);
        int n=0;
 
        while (n < m-2)
        {
                x = x+h;
                if (n%2==0) I=I+4*Fx(x);
                        else  I = I+2*Fx(x);
                n++;
        }
 
        return I*h/3;
}
синус
C++
1
2
3
4
5
double sinus(double x)
{
       /* формула от какой найти интеграл */
       return x;
}
как правильно записать формулу что бы найти правильное разбиение ? пожалуйста больно не бейте я по алгоритмам больше и по СУБД
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
13.10.2009, 00:35     Нахождение интеграла методом Симпсона #2
Цитата Сообщение от ~DWORD~ Посмотреть сообщение
имеется функция
я даже знаю автора этой функции

Цитата Сообщение от ~DWORD~ Посмотреть сообщение
как правильно записать формулу что бы найти правильное разбиение ?
что ты имеешь ввиду? Как записать форумул от которой интеграл взять? Или кол-во разбиений на интервалы? Дело в том, что здесь кол-во разбиений вводит пользователь, так как это фактически является точностью - чем больше интервалом, тем точнее результат.
~DWORD~
 Аватар для ~DWORD~
3 / 3 / 0
Регистрация: 13.10.2009
Сообщений: 10
13.10.2009, 01:06  [ТС]     Нахождение интеграла методом Симпсона #3
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
что ты имеешь ввиду? Как записать форумул от которой интеграл взять?
да я на картинке пример написал только не понимаю как ее сюда добавить
C++
1
2
3
4
5
double sinus(double x)
{
       /* формула от какой найти интеграл */
       return x;
}
заранее спасибо за любую помощь
Том Ардер
Модератор
 Аватар для Том Ардер
3619 / 2238 / 271
Регистрация: 15.06.2009
Сообщений: 3,924
13.10.2009, 04:50     Нахождение интеграла методом Симпсона #4
Цитата Сообщение от ~DWORD~ Посмотреть сообщение
h=(b-a)/(m-1);
Почему m-1?

[CPP][h=(b-a)/m;/CPP]
m д.б. чётным

Подынтегральная функция
C++
1
2
3
4
5
6
double f(double x)
{
    double r = sin(x);
    r = 1. - r*r/4.;
    return r;
}
Интеграл:
C++
1
2
3
4
5
6
7
8
double I2 = 0, I4 = 0;
for(int k = 2; k<m;k+=2)
{
    I2 += Fx(a+k*h);
    I4 += Fx(a+(k-1)*h);
}
I = Fx(a)+Fx(b)+4*I4+2*I2;
I *= h/3;
Том Ардер
Модератор
 Аватар для Том Ардер
3619 / 2238 / 271
Регистрация: 15.06.2009
Сообщений: 3,924
13.10.2009, 11:00     Нахождение интеграла методом Симпсона #5
Поправка:
C++
1
2
3
4
5
6
I4 = Fx(a+h);
for(int k = 2; k < m; k += 2 )
{
    I4 += Fx(a+(k+1)*h);
    I2 += Fx(a+k*h);
}
Том Ардер
Модератор
 Аватар для Том Ардер
3619 / 2238 / 271
Регистрация: 15.06.2009
Сообщений: 3,924
13.10.2009, 15:38     Нахождение интеграла методом Симпсона #6
Ещё 5 копеек:

лучше разделить ввод/вывод и вычисления, примерно так:
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 func(double x )
{
    // function code
}
double simpson( double (*Fx)(double), double a, double b, int m);
 
int main()
{
    // ввод параметров
    // ....................
 
    // вычисление интеграла
 
    I = simpson( &func, a, b, m );
 
    // вывод результата
    // ................
}
 
double simpson( double (*Fx)(double), double a, double b, int m)
{
    // здесь код только вычислений
}
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
13.10.2009, 17:06     Нахождение интеграла методом Симпсона #7
Цитата Сообщение от ~DWORD~ Посмотреть сообщение
да я на картинке пример написал только не понимаю как ее сюда добавить
жмешь "Расширенный режим", далее в тулбаре нажимаешь значек "Скрепки", а дальше думаю разберешься.


Смотри, например тебе нужно взять определнный интеграл от x^2 + 3*x. Тогда пишется функция такая:

C++
1
2
3
4
double somefunc(double x)
{
    return x*x + 3*x;
}
~DWORD~
 Аватар для ~DWORD~
3 / 3 / 0
Регистрация: 13.10.2009
Сообщений: 10
13.10.2009, 17:47  [ТС]     Нахождение интеграла методом Симпсона #8
спасибо всем =)
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <math.h>
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
 
using namespace std;
 
//ÏîäûГ*ГІГҐГЈГ°Г*ëüГ*Г*Гї ГґГіГ*êöèÿ
double func(double x)
{
    double r = sin(x);
    r = 1. - r*r/4.;
    return r;
}
double simpson( double (*Fx)(double), double a, double b, int m);
 
#pragma argsused
int main(int argc, char* argv[])
{
   double I;
   double a,b;
   int m;
 
   cout << "\n Input integral atributes:\n" << endl;
   cout << "\t-> Enter a = ";
   cin >> a;
 
   cout << "\t-> Enter b = ";
   cin >> b;
 
   cout << "\t-> Enter m = ";
   cin >> m;
 
   // âû÷èñëåГ*ГЁГҐ ГЁГ*ГІГҐГЈГ°Г*Г«Г*
 
   I = simpson( &func, a, b, m );
 
   // âûâîä ðåçóëüòГ*ГІГ*
   cout << endl << "      I = " << I;
   getch();
}
 
//---------------------------------------------------------------------------
// Ìåòîä ñèìïñîГ*Г*
double simpson( double (*Fx)(double), double a, double b, int m)
{
 
   double h;
   h=(b-a)/m;
 
   double I, I2 = 0, I4 = 0;
   I4 = Fx(a+h);
   for(int k = 2; k < m; k += 2 )
   {
       I4 += Fx(a+(k+1)*h);
       I2 += Fx(a+k*h);
   }
   I = Fx(a)+Fx(b)+4*I4+2*I2;
   I *= h/3;
 
   return I;
}
//---------------------------------------------------------------------------
кирилл0
0 / 0 / 0
Регистрация: 25.10.2009
Сообщений: 5
26.11.2010, 11:50     Нахождение интеграла методом Симпсона #9
что такое getch(); ? компилятор выдает на нем следующую ошибку
In function `int main(int, char**)':
`getch' undeclared (first use this function)
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
26.11.2010, 16:56     Нахождение интеграла методом Симпсона #10
кирилл0, getch(); - ожидание ввода символа. часто применяется для того, чтоб окно консоли на закрывалось после своего выполнения. находится в conio.h (насколько я помню) и функция не входит в стандарт языка, на сколько я зщнаю.

Лучше используй вместо нее:
либо
C++
1
std::cin.get();
либо
C++
1
system("pause");
кирилл0
0 / 0 / 0
Регистрация: 25.10.2009
Сообщений: 5
26.11.2010, 21:53     Нахождение интеграла методом Симпсона #11
Monte-Cristo

Спасибо,
impuls__s
0 / 0 / 0
Регистрация: 10.02.2010
Сообщений: 37
13.02.2011, 18:34     Нахождение интеграла методом Симпсона #12
подскажите где взять <vcl.h> ???
выдает ошибку.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2014, 00:17     Нахождение интеграла методом Симпсона
Еще ссылки по теме:

Приближенное значения определённого интеграла по квадратурным формулам прямоугольника, трапеций, Симпсона C++
Найти значения определенного интеграла по формулам прямоугольников, трапеции и Симпсона C++
Значения определенного интеграла по формулам трапеций и Симпсона C++

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

Или воспользуйтесь поиском по форуму:
Vovochka
0 / 0 / 0
Регистрация: 19.05.2014
Сообщений: 8
21.05.2014, 00:17     Нахождение интеграла методом Симпсона #13
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
double Fx(double x)                 //  функція
{ double s; 
s=sin(x);
return s;                                //   повертає значення "х"
}
void __fastcall TForm1::ToolButton1Click(TObject *Sender)
{
double a,b,h,n,s=0,s1=0,s2=0,x; // змінні
int i;
a=StrToFloat(Edit1->Text);        //  нижня межа інтеграла
b=StrToFloat(Edit2->Text);        //  верхня межа інтеграла
n=StrToInt(CSpinEdit1->Text);   //  кількість розбиттів
h=(b-a)/n;                              //  величина кроку
if(a==b)
ShowMessage("Невірні значення a i b");
{for(i=0;i<=n-1;i++)
{x=a+i*h;
if (i%2==0)
s2=s2+Fx(x);
else s1=s1+Fx(x);}
s=h/3*(Fx(a)+Fx(b)+4*s1+2*s2);
Form1->Memo1->Lines->Text="Інтеграл від функції X на проміжку["+FloatToStr(a)+";"+FloatToStr(b)+"] дорівнює "+FloatToStr(s);
}
}
я вот так делал
Yandex
Объявления
21.05.2014, 00:17     Нахождение интеграла методом Симпсона
Ответ Создать тему
Опции темы

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