Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/235: Рейтинг темы: голосов - 235, средняя оценка - 4.55
4 / 4 / 0
Регистрация: 13.10.2009
Сообщений: 10
1

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

13.10.2009, 00:12. Показов 47060. Ответов 12
Метки нет (Все метки)

[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;
}
как правильно записать формулу что бы найти правильное разбиение ? пожалуйста больно не бейте я по алгоритмам больше и по СУБД
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2009, 00:12
Ответы с готовыми решениями:

Нахождение интеграла методом Симпсона
Что не так? #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;conio.h&gt; #include&lt;stdio.h&gt; using...

Программа для вычисления интеграла с заданной точностью методом Симпсона и методом Монте-Карло
Здравствуйте, подскажите как решить эту задачу, пожалуйста: Разработать программу для вычисления...

Решение интеграла методом симпсона
Здравствуйте, помогите исправить программу. Она работает для заданного интеграла с нижней границей...

Составить программу для вычисления определенного интеграла методом Симпсона
ПОМОГИТЕ ПОЖАЛУЙСТА Составить программу для вычисления определенного интеграла методом...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
12
2808 / 1399 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
13.10.2009, 00:35 2
Цитата Сообщение от ~DWORD~ Посмотреть сообщение
имеется функция
я даже знаю автора этой функции

Цитата Сообщение от ~DWORD~ Посмотреть сообщение
как правильно записать формулу что бы найти правильное разбиение ?
что ты имеешь ввиду? Как записать форумул от которой интеграл взять? Или кол-во разбиений на интервалы? Дело в том, что здесь кол-во разбиений вводит пользователь, так как это фактически является точностью - чем больше интервалом, тем точнее результат.
1
4 / 4 / 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;
}
заранее спасибо за любую помощь
0
Модератор
Эксперт по математике/физике
4129 / 3288 / 377
Регистрация: 15.06.2009
Сообщений: 5,577
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;
1
Модератор
Эксперт по математике/физике
4129 / 3288 / 377
Регистрация: 15.06.2009
Сообщений: 5,577
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);
}
1
Модератор
Эксперт по математике/физике
4129 / 3288 / 377
Регистрация: 15.06.2009
Сообщений: 5,577
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)
{
    // здесь код только вычислений
}
1
2808 / 1399 / 107
Регистрация: 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;
}
1
4 / 4 / 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;
}
//---------------------------------------------------------------------------
2
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)
0
2808 / 1399 / 107
Регистрация: 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

Спасибо,
0
0 / 0 / 0
Регистрация: 10.02.2010
Сообщений: 37
13.02.2011, 18:34 12
подскажите где взять <vcl.h> ???
выдает ошибку.
0
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);
}
}
я вот так делал
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.05.2014, 00:17

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Нахождение определенного интеграла методом прямоугольников и методом трапеций
Написать программу, которая находит определенный интеграл \int_{a}^{b}f(x)dx методом...

Нахождение определенного интеграла методом Гаусса
Помогите мне пожалуйста... Очень надо, горю...........

Нахождение интеграла методом Ньютона-Котеса
Добрый вечер,Ребят, помогите пожалуйста написать код на С++ Нахождение интеграла методом...

Вычисление значения трех определенных интегралов методом трапеций или методом Симпсона
Всем привет, нужна конкретная помощь по написанию проги по такому условию. Написать программу,...

Найти площадь фигуры методом трапеций и методом Симпсона
Доброе время суток Я студент поэтому прошу не нападать мне нужно написать код для тапазойдного и...

Значения определенного интеграла по формулам трапеций и Симпсона
Нужно вычислить значения определенного интеграла по формулам трапеций и Симпсона. С помощью вызова...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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