Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/27: Рейтинг темы: голосов - 27, средняя оценка - 4.56
koperfild
9 / 9 / 6
Регистрация: 04.12.2011
Сообщений: 137
1

Интеграл методом трапеций

10.06.2012, 16:09. Просмотров 5198. Ответов 6
Метки нет (Все метки)

Программа считает интеграл методом трапеций. Почему то, если задать, например, функцию y = x , и посчитать на отрезке -0,1234 до 0,1234 и наоборот: от 0,1234 до -0,1234 то погрешность разная и интеграл не равен 0. Можно конечно для второго случая поменять значения друг на друга, но надо понять почему так.

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
#include "function.h"
 
 
double Integral (double (*f)(double), double, double, int);
 
int main(){
   double a,b;
   int n;
   double (*f)(double);
 
   printf ("Vvedite a\n");
   scanf ("%lf", &a);
   printf ("Vvedite b\n");
   scanf ("%lf", &b);
   printf ("Vvedite n - koli4estvo razbienii otrezka\n");
   scanf ("%d", &n);
   f = fun;
   printf ("Integral raven %.15lf\n", Integral (f, a, b, n));
   return 0;
}
 
 
double Integral (double (*f)(double), double a, double b, int n){
 
   double result = 0.0;
   double delta;
 
   delta = (b - a) / (double) n;
   
   int i;
   result += (f(a) + f(b)) * delta / 2;
   for (i = 1; i < n; ++i){
      result += f(a + i * delta) * delta;
   }
   return result;
   
}
C
1
2
3
4
5
6
7
#include "function.h"
 
double fun(double x){
 
    return x;
 
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2012, 16:09
Ответы с готовыми решениями:

Разработать программу для вычисления интеграла методом трапеций и методом Симпсона
Разработать программу для вычисления интеграла методом трапеций и методом Симпсона, оформив каждый...

Вычислить интеграл по формуле трапеций
задание на картинке

Вычислить интеграл методами правых прямоугольников, трапеций и Симпсона
1. Вычислить интеграл методами правых прямоугольников, трапеций и Симпсона с шагом разбиения h =...

Решение пользовательского интеграла методом трапеций
Доброго времени суток, товарищи программисты. Задача следующая:решение пользовательского интеграла...

Интеграл методом трапеции
Напишите программу по решению интегралов через универсальную функцию.

6
taras atavin
4189 / 1780 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
10.06.2012, 16:25 2
koperfild, один мой студент делал численный интеграл произвольным порядком аппроксимации. Не только прямоугольниками, трапециями и параболами, но и кусочно-кубическим методом, и по четвертой степени и даже выше. Я сейчас не помню формул, но там фокус был в том, что был аналитически в общем виде решен интеграл кривой n-го порядка, проходящей через n+1 точек. Даже не отдельно вычисление коэффициентов и отдельно к ним интеграл фрагмента, а сразу с точек вычисляется интеграл, описывающий площадь криволинейной трапеции.

Добавлено через 1 минуту
Цитата Сообщение от koperfild Посмотреть сообщение
Почему то, если задать, например, функцию y = x , и посчитать на отрезке -0,1234 до 0,1234 и наоборот: от 0,1234 до -0,1234 то погрешность разная и интеграл не равен 0. Можно конечно для второго случая поменять значения друг на друга, но надо понять почему так.
Построй графически и посмотри, в чём дело.

Добавлено через 3 минуты
result += (f(a) + f(b)) * delta / 2;
С какой стати? f(a) - самая левая точка, f(b) - самая правая. При n>1 они не могут быть в одной трапеции.

Добавлено через 4 минуты
Цитата Сообщение от koperfild Посмотреть сообщение
for (i = 1; i < n; ++i){
* * * result += f(a + i * delta) * delta;
не учитываешь последнюю трапецию. И формулу переврал: площадь каждой i-той трапеции - произведение её высоту на полусумму оснований, а ты берёшь только одно основание. Это метод прямоугольников в левой разности, он и должен давать разные погрешности в зависимости от направления.
0
koperfild
9 / 9 / 6
Регистрация: 04.12.2011
Сообщений: 137
10.06.2012, 16:25  [ТС] 3
Осмысливаю...
Они и не в одной трапеции. У нас есть числовой ряд в виде суммы (f(a)+f(a+delta))*delta/2 . В нём f(a+delta) встречаются по 2 раза поэтому в цикле они без /2. А до этого я просто складываю (f(a)+f(b))*delta/2
0
taras atavin
4189 / 1780 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
10.06.2012, 16:30 4
C++
1
2
3
4
5
6
7
8
9
double Integral (double (*f)(double), double a, double b, int n)
{
 double result, left, right, delta; 
 for (result=0.0, left=a, delta=(b-a)/(double)n, right=left+delta; right<=b; left=right; right+=delta)
 {
  result+=(f(left)+f(right))*delta/2.0;
 }
 return r;
}
Добавлено через 39 секунд
Цитата Сообщение от koperfild Посмотреть сообщение
Они и не в одной трапеции.
Тогда на каком основании ты добавляешь такую сумму?
0
grizlik78
Эксперт С++
2115 / 1555 / 230
Регистрация: 29.05.2011
Сообщений: 3,233
10.06.2012, 16:36 5
На самом деле, не смотря на то, что сказал taras atavin, на первый взгляд всё правильно. Более того, у меня результат в обе стороны равен нулю.
Вот вывод для двух запусков:

$ ./a.out
Vvedite a
0.1234
Vvedite b
-0.1234
Vvedite n - koli4estvo razbienii otrezka
100
Integral raven -0.000000000000000

$ ./a.out
Vvedite a
-0.1234
Vvedite b
0.1234
Vvedite n - koli4estvo razbienii otrezka
100
Integral raven -0.000000000000000

Добавлено через 23 секунды
Цитата Сообщение от taras atavin Посмотреть сообщение
Тогда на каком основании ты добавляешь такую сумму?
На основании формулы интегрирования трапециями.
0
koperfild
9 / 9 / 6
Регистрация: 04.12.2011
Сообщений: 137
10.06.2012, 16:42  [ТС] 6
Цитата Сообщение от taras atavin Посмотреть сообщение
Тогда на каком основании ты добавляешь такую сумму?
Я представил сумму (f(a)+f(a+delta))*delta/2 + (f(a+delta)+f(a+2delta))*delta/2 +... + (f(a+(n-1)delta)+f(b))*delta/2
Все члены кроме первого f(a) и последнего f(b) дублируются. Поэтому я и считаю их отдельно. Указанную вами ошибки, что я не считаю последнюю трапецию, я не нашёл.

Добавлено через 5 минут
Цитата Сообщение от grizlik78 Посмотреть сообщение
На самом деле, не смотря на то, что сказал taras atavin, на первый взгляд всё правильно. Более того, у меня результат в обе стороны равен нулю.
Вот вывод для двух запусков:

$ ./a.out
Vvedite a
0.1234
Vvedite b
-0.1234
Vvedite n - koli4estvo razbienii otrezka
100
Integral raven -0.000000000000000

$ ./a.out
Vvedite a
-0.1234
Vvedite b
0.1234
Vvedite n - koli4estvo razbienii otrezka
100
Integral raven -0.000000000000000

Добавлено через 23 секунды

На основании формулы интегрирования трапециями.
В windows в codeblocks у меня тоже 0 получается. А в универе на fedora не 0. И я не могу сдать эту задачу
0
grizlik78
Эксперт С++
2115 / 1555 / 230
Регистрация: 29.05.2011
Сообщений: 3,233
10.06.2012, 16:53 7
У меня не федора, но тоже линукс. Надо бы видеть весь ввод-вывод, примерно как у меня. А гадать бесполезно, я пока ошибки не вижу.

Добавлено через 8 минут
Умножение на delta я бы вынес за скобку и производил бы в самом конце, после суммирования. Но на результат это, разумеется не влияет.
0
10.06.2012, 16:53
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2012, 16:53

Интеграл методом прямоугольников
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; int main () { float a = -1; float...

Решить интеграл методом Монте-Карло
Помогите добить задачу, беда в том что не могу сообразить как срандомировать точки в пределах для...

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


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

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

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