0 / 0 / 0
Регистрация: 22.03.2019
Сообщений: 9
1

Вычисление определенного интеграла с применением метода трапеций

22.03.2019, 21:44. Показов 3252. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1. Реализовать программму вычисления площади фигуры, ограниченной кривой
4 * x ^ 3 + (4) * x ^ 2 + (-322) * x + (3723).
2. Вычисление определенного интеграла должно выполняться численно, с применением метода трапеций.
3. Пределы интегрирования вводятся пользователем.
4. Взаимодействие с пользователем должно осуществляться посредством case-меню.
5. Требуется реализовать возможность оценки погрешности полученного результата.
6. Необходимо использовать процедуры и функции там, где это целесообразно.

HELP!!!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2019, 21:44
Ответы с готовыми решениями:

Вычисление определенного интеграла методом трапеций.
Методом трапеций вычислить значение интеграла S = (cos (x)) на отрезке интегрирования . Считать...

Вычисление определённого интеграла методом прямоугольников и трапеций
Составить алгоритм и написать программу вычисления определённого интеграла на заданном отрезке...

Вычисление определенного интеграла функции на заданном отрезке (метод трапеций)
Пожалуйста,помогите решить:составить алгоритм и написать программу вычисления определенного...

Вычисления определенного интеграла методом трапеций
Вычисления определенного интеграла методом трапеций Помогите сделать задачу пожалуйста!

9
2373 / 775 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
23.03.2019, 06:42 2
Лучший ответ Сообщение было отмечено adm_uz как решение

Решение

Pascal
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Program zadanie015;
uses
 crt;
 
procedure menu;
begin
writeln('Нажмите "F1" чтобы осуществить ввод данных для вычислений.');
writeln('Нажмите "F2" чтобы осуществить вычисление площади фигуры и получить результат.');
writeln('Нажмите "F3" чтобы вычислить погрешности.(Возможна только после вычислений)');
writeln('Нажмите "ESC" чтобы выйти из программы.');
end;
 
function SliceFigur (x,ybord: real) : real;
begin
 SliceFigur:=abs( ybord - (4*x*x*x + 4*x*x + (-322)*x + 3723));
end;
 
var
  downx: real;  // Переменная для хранения значений нижней границы интегрирования.
  upx: real;    // Переменная для хранения значений верхней границы интегрирования.
  stepx: real;   // Переменная для хранения значений шага интегрирования.
  ybord1: real;  // Переменная для хранения значений ограничения площади фигуры.
  y1,y2: real;      // Промежуточные переменная для хранения значений площади трапеции.
  sq: real;     // Переменная для хранения значений площади фигуры.
  x1: real;     // Промежуточная переменная для хранения значений аргумента.
  key: char;     // Переменная для хранения значений кода клавиш.
  Efn: real;      // Переменная для хранения значения погрешности аппроксимации.
  Ef: real;      // Переменная для хранения значения погрешности аппроксимации.
  N: integer;    // Количество аппроксимаций.
begin
menu;
repeat
key := ReadKey;
case key of
 #59  : begin
         Writeln('Введите нижнюю границу интегрирования:');
         Readln(downx);
         Writeln('Введите верхнюю границу интегрирования:');
         Readln(upx);
         Writeln('Введите шаг интегрирования:');
         Readln(stepx);
         Writeln('Введите значение Y для ограничения площади фигуры:');
         Readln(ybord1);
 
         if (downx >= upx ) or (stepx > upx) or (stepx < 0) then
           begin
            Writeln('Значения для вычислений введены некорректно!');
            Writeln('Попытайтесь снова. Выберете нужный пункт меню');
           end
         else
            Writeln('Ввод данных осуществлен успешно.');
         Writeln;
         menu;
        end;
 #60 : begin
         N:=0;
         sq:=0;
         x1:=downx;
         Ef:= stepx*stepx*stepx/12; // Вычисляем погрешность аппроксимации.
         repeat
           inc(N);
           y1:= SliceFigur(x1,ybord1);// Вычисляем длину отрезка в начале.
           x1:=x1+stepx;
           y2:= SliceFigur(x1,ybord1);// Вычисляем длину отрезка на следующем шаге.
           sq:=sq + ((y1+y2)/2)*stepx - Ef;  { Вычисляем площадь трапеции фигуры, ограниченной условиями и прибавляемм ее к
         к общей площади фигуры (интегрирование), а также вычитаем величину погрешности}
           until x1 > upx;
         Writeln('Площадь вычисляемой фигуры равна: ',sq:0:4);
         Writeln;
         menu;
        end;
 #61  : begin
          Efn:= N*stepx*stepx*stepx/12;
          Writeln('Количество аппроксимаций: ',N);
          Writeln('Погрешность аппроксимации: ',Efn:0:4);
          menu;
        end;
end;
until key = #27
end.
1
2373 / 775 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
29.03.2019, 05:03 3
Pascal
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
unit IntegSq_Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, TAGraph, TASeries, Forms, Controls, Graphics,
  Dialogs, StdCtrls, Menus, IntegSq_Unit2;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Chart1: TChart;
    Chart1AreaSeries1: TAreaSeries;
    Chart1ConstantLine1: TConstantLine;
    Chart1LineSeries1: TLineSeries;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    MainMenu1: TMainMenu;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    MenuItem3: TMenuItem;
    MenuItem4: TMenuItem;
    MenuItem5: TMenuItem;
    MenuItem6: TMenuItem;
    MenuItem7: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure MenuItem3Click(Sender: TObject);
    procedure MenuItem4Click(Sender: TObject);
    procedure MenuItem7Click(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
  downx: real;  // Переменная для хранения значений нижней границы интегрирования.
  upx: real;    // Переменная для хранения значений верхней границы интегрирования.
  stepx: real;   // Переменная для хранения значений шага интегрирования.
  ybord1: real;  // Переменная для хранения значений ограничения площади фигуры.
  sly1,sly2: real;      // Промежуточные переменная для хранения значений площади трапеции.
  sq: real;     // Переменная для хранения значений площади фигуры.
  x1: real;     // Промежуточная переменная для хранения значений аргумента.
  Efn: real;      // Переменная для хранения значения погрешности аппроксимации.
  Ef: real;      // Переменная для хранения значения погрешности аппроксимации.
  N: integer;    // Количество аппроксимаций.
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
function YFigur (x: real) : real; //Процедура, в которой вычислется верхняя граница вычислений площади.
begin
 YFigur:=4*x*x*x + 4*x*x + (-322)*x + 3723;
end;
 
 
 
procedure TForm1.MenuItem4Click(Sender: TObject);
// Обработчик события подменю "Вычислить".
var
  cod1,cod2,cod3,cod4: integer; //Промежуточные переменные для работы с кодами ошибок.
  time: integer; // Переменная для задания значения величины временной паузы.
begin
  val(Edit3.Text,downx,cod1);
  if cod1 <> 0 then
    if MessageDlg('Введенные значения некорректны. Попытайтесь ещё.',mtError,[mbOk],0) = mrOk then
       Edit3.Text:='0';
  val(Edit1.Text,upx,cod2);
  if cod1 <> 0 then
    if MessageDlg('Введенные значения некорректны. Попытайтесь ещё.',mtError,[mbOk],0) = mrOk then
       Edit1.Text:='0';
  val(Edit2.Text,stepx,cod3);
  if cod1 <> 0 then
    if MessageDlg('Введенные значения некорректны. Попытайтесь ещё.',mtError,[mbOk],0) = mrOk then
       Edit2.Text:='0';
  val(Edit4.Text,ybord1,cod4);
  if cod1 <> 0 then
    if MessageDlg('Введенные значения некорректны. Попытайтесь ещё.',mtError,[mbOk],0) = mrOk then
       Edit4.Text:='0';
  if (downx >= upx ) then
    MessageDlg('Введенные значения некорректны. Верхняя граница вычислений не может быть равна или меньше нижней границы.',mtError,[mbOk],0);
  if (stepx >= upx) then
    MessageDlg('Введенные значения некорректны. Шаг интегрирования не может быть больше верхней границы вычислений.',mtError,[mbOk],0);
  if (stepx < 0) then
    MessageDlg('Введенные значения некорректны. Шаг интегрирования не может иметь нулевое или отрицательное значение.',mtError,[mbOk],0);
 
  N:=0;  //Устанавливаем начальные значения переменных.
  sq:=0;
  x1:=downx;
  Ef:= stepx*stepx*stepx/12; // Вычисляем погрешность аппроксимации.
  Chart1.Extent.XMin := downx - trunc((upx - downx) / 10); // Задаем левую границу графика.
  Chart1.Extent.XMax := upx + trunc((upx - downx) / 10);  //  Задаем правую границу графика.
  Chart1.Extent.YMin := ybord1  - trunc(abs(YFigur(upx) - ybord1 ) / 10); // Задаем нижнюю границу графика.
  Chart1.Extent.YMax := YFigur(upx) + trunc(abs(YFigur(upx) - ybord1) / 10);   // Задаем верхнюю границу графика.
  Chart1AreaSeries1.ZeroLevel:= ybord1; // Задаем нулевой уровень для областей заполнения графика. (совпадает с нижней границей вычисления площади).
  Chart1AreaSeries1.Clear;  // Очищаем график от предыдущих построений, если они были.
  if MenuItem5.Checked then
     time:= 5000 div trunc((upx - downx) / stepx)  // Вычисляем величину паузы в зависимости от количества аппроксимаций..
     else
     time:=0;
  repeat
    Application.ProcessMessages;
    Sleep(time);  // Приостанавливаем вычисления на время в миллисекундах.
    inc(N);    //   Прибавляем счетчик аппроксимаций.
    sly1:= abs(ybord1 - YFigur(x1));// Вычисляем длину отрезка в начале.
    Chart1AreaSeries1.AddXY(x1,YFigur(x1),'',clBlack); // Прорисовываем график.
    x1:=x1+stepx;    // Прибавляем значение аргумента на величину шага.
    sly2:= abs(ybord1 - YFigur(x1));// Вычисляем длину отрезка на следующем шаге.
    Chart1AreaSeries1.AddXY(x1,YFigur(x1),'',clBlack);
    sq:=sq + ((sly1+sly2)/2)*stepx - Ef;  { Вычисляем площадь трапеции фигуры, ограниченной условиями и прибавляем ее к
         к общей площади фигуры (интегрирование), а также вычитаем величину погрешности}
 
  until x1 > upx - stepx;
  Efn:= N*stepx*stepx*stepx/12; // Вычисляем погрешность.
  Edit5.Text:= FloatToStrF(sq, ffFixed, 12, 2);  // Форматированный вывод результата вычисления площади.
  Edit6.Text:= FloatToStrF(Efn, ffFixed, 8, 4);  // Форматированный вывод значения погрешности.
  Edit7.Text:= IntToStr(N);  // Вывод количества аппроксимаций.
end;
 
 
procedure TForm1.MenuItem7Click(Sender: TObject);
// Обработчик события подменю "Прочитать задание".
begin
  if (not Assigned(Form2)) then
       Form2:=TForm2.Create(Self);
 
  IntegSq_Unit2.Form2.Memo1.Lines.LoadFromFile('zadanie.txt');
       Form2.ShowModal;
 
end;
 
procedure TForm1.MenuItem3Click(Sender: TObject);
// Обработчик события подменю "Выход".
begin
  Form1.Close;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
// Обработчик события "Создание формы".
begin
   Edit1.Text:='0';
   Edit2.Text:='0';
   Edit3.Text:='0';
   Edit4.Text:='0';
   Edit5.Text:='';
   Edit6.Text:='';
   Edit7.Text:='';
   MenuItem5.Checked:=false;
end;
 
 
end.
В приложении находится проект вместе с исполняемым файлом.
Лучше всего запустить у себя Lazarus и создать исполняемый файл собственного производства.
Файл 'zadanie.txt' содержит текст задания.
Вложения
Тип файла: zip IntegSq.zip (1.65 Мб, 4 просмотров)
0
2373 / 775 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
29.03.2019, 06:39 4
Первоначальный вариант глючит, я его пересобрал. Новый вариант программы в приложении без исполняемого файла.
Вложения
Тип файла: zip IntegrSqr.zip (489.8 Кб, 9 просмотров)
0
Модератор
9656 / 4976 / 3265
Регистрация: 17.08.2012
Сообщений: 15,476
30.03.2019, 22:36 5
ValentinNemo,

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\int_{a}^{b}f(x)\operatorname{d}x=-\int_{b}^{a}f(x)\operatorname{d}x<br />

У Вас это непонятно почему считается за ошибку.

Оценка погрешности, применённая Вами, не совсем корректна. По крайней мере, у меня она вызывает сомненья.

Моё решение.

Имеется функция f(x) = 4x3 + 4x2 - 322x + 3723. Функция и все её производные не содержат разрывов на всей действительной оси.

Вторая производная этой функции f"(x) = 24x + 8 - уравнение прямой линии.

Для интегрирования методом трапеций проще всего применить несколько изменённую формулу Кортеса:

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
S=h\left(\frac{f(a)+f(b)}{2}+\sum_{i=1}^{n-1}f(a+i\cdot h) \right)+R<br />

где:
h = (b - a) / n - шаг;
n - количество интервалов разбиения:
R - невязка (разность между истинным значением и вычисленным).

Известно, что

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
|R|\leq \begin{vmatrix}\frac{(b-a)^3}{{12n}^2}\end{vmatrix}M_2<br />

где

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
M_2=\max_{x\in [a,\,b]}\begin{vmatrix}f^{''}(x)\end{vmatrix}<br />

Вычислить M2 заранее не составляет никакого труда, поскольку f"(x) - прямая:

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
M_2=\max \left( \begin{vmatrix}f^{''}(a)\end{vmatrix},\ \begin{vmatrix}f^{''}(b)\end{vmatrix}\right)<br />

Незачем оценивать погрешность, если можно вычислить с заданной погрешностью. Примем ε=|R|, и исходя из заданных a, b и ε найдём количество интервалов разбиения и шаг:

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
n\geq \sqrt{\begin{vmatrix}\frac{(b-a)^3}{12\varepsilon }\end{vmatrix}M_2};\ \ \ h=\frac{b-a}{n}<br />

Результат: вводятся только пределы интегрирования и точность, что логично, для вычисления значения интеграла с заданной погрешностью применяется предопределённый цикл, нижний предел интегрирования может быть меньше, больше или равен верхнему пределу, как и положено.
Pascal
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
uses
  crt;
 
function f(x: real): real;
begin
  f := 4 * x * (x * (x + 1) - 80.5)+ 3723
end;
 
function abs_m2(x: real): real;
begin
  abs_m2 := abs(24 * x + 8)
end;
 
procedure inp(c: string; var t: real; var q: boolean);
begin
  clrscr;
  write(c, ' = ');
  readln(t);
  q := false
end;
 
var
  m: array[1..5] of string[37];
  a, b, e, s, h, t, t2: real;
  i, n: longint;
  ch: char;
  ex: boolean;
 
begin
  m[1] := 'Нижний предел интегрирования  = ';
  m[2] := 'Верхний предел интегрирования = ';
  m[3] := 'Точность вычисления интеграла = ';
  m[5] := 'Выйти из программы';
  ex := false;
  a := 0;
  b := 0;
  e := 0.0001;
  s := 0;
  repeat
    clrscr;
    if ex
      then m[4] := 'Значение интеграла            = '
      else m[4] := 'Вычислить значение интеграла';
    writeln('Вычисление интеграла функции f(x) = 4x^3 + 4x^2 - 322x + 3723');
    for i := 1 to 5 do
      begin
        write(i, ': ', m[i]);
        case i of
          1: writeln(a:0:15);
          2: writeln(b:0:15);
          3: writeln(e:0:15);
          4: if ex then writeln(s:0:15) else writeln;
          5: writeln
        end;
      end;
    write('Введите номер действия');
    ch := readkey;
    case ch of
      '1': inp('Нижний предел интегрирования', a, ex);
      '2': inp('Верхний предел интегрирования', b, ex);
      '3': repeat
             clrscr;
             write('Точность вычисления > 0;  Точность вычисления интеграла = ');
             readln(e);
             ex := false
           until e > 0;
      '4': begin
             t := abs_m2(a);
             t2 := abs_m2(b);
             if t > t2 then t2 := t;
             t := b - a;
             t := sqrt(abs(t * t * t / 12 / e) * t2);
             n := trunc(t);
             if frac(t) > 0 then inc(n);
             if n > 0 then h := (b - a) / n else h := 0;
             s := (f(a) + f(b)) / 2;
             for i := 1 to n - 1 do s := s + f(a + i * h);
             s := s * h;
             ex := true
           end
    end
  until ch = '5'
end.
1
2373 / 775 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
31.03.2019, 16:39 6
Cyborg Drone, все что вы описали выше - это все хорошо и правильно ... но в чем тогда профит от использования вычислительной техники? Значение интегралов математики научились получать без численных методов.
В вашем алгоритме нужно отдельно найти вторую производную, то есть использовать отдельный компьютер, тот который у всех между ушами. А сделать так, чтобы было как можно проще и без привлечения дополнительных вычислительных мощностей никак нельзя?
То есть прописать функцию на компьютерном языке, задать ограничения со всех сторон (ибо компьютер глуп и может считать числа до бесконечных величин), задать шаг интегрирования или количество аппроксимаций и получить результат, без вычисления производных, в том числе и вычислить из всех этих данных точность.
Или так вычислить погрешность невозможно?
0
Модератор
9656 / 4976 / 3265
Регистрация: 17.08.2012
Сообщений: 15,476
31.03.2019, 20:40 7
ValentinNemo, применение "отдельного компьютера", по моему мнению, всегда оправдано: это упрощает вычисления. Тем боле, если нужно написать программу для конкретной функции. Если вообще для любой функции (то есть, функция вводится во время работы программы), то (практически всегда) можно получить производную из строкового представления функции. В молодости, было дело, писал программу символьного дифференцирования. Ничего оригинального: таблица производных и парсинг строки. Можно, конечно, вычислять вторую производную (ускорение изменения функции) численно, но точность вычислений и скорость работы от этого пострадают. Можно и без производных, но тогда для получения достоверной оценки точности нужно вычислить на каждом шаге интеграл с гарантированным избытком и с гарантированным недостатком (метод трапеций для этого подходит плохо), либо применить другой метод, позволяющий оценить погрешность без вычисления производных. Ещё для оценки точности вычислений используется методы удвоения или утроения количества разбиений, но не для каждой функции оценка получается достоверной (поэтому и используют вторую производную, чтобы учесть "кривизну" функции). Без производных оценка точности, как правило, получается плюс-минус лапоть.

В принципе, всё можно сделать численными методами, в том числе, и оценку погрешности. Объём кода будет большим, работать программа будет значительно медленнее.
1
2373 / 775 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
01.04.2019, 02:29 8
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
В принципе, всё можно сделать численными методами, в том числе, и оценку погрешности. Объём кода будет большим, работать программа будет значительно медленнее.
Так здесь нет гигабайтов кода и призы за быстроту исполнения кода тоже не раздают. Одна-единственная функция (не слишком сложная). И что из того, что она будет вычисляться, условно говоря, на 10 миллисекунд больше. Львиная доля компьютерного времени расходуется для обработки текстов юридического, бухгалтерского или бюрократического плана или для распределения аудио и видеопотоков в сети.
Я, конечно в восторге от ваших математических способностей, но в данном случае, мне было бы интересно, если бы вы нашли время и рассказали про алгоритм, который бы вычислял интеграл и его погрешность именно численно и без производных. (Сейчас мало кто подробно что-то рассказывает. В основном отбиваются фразой вроде "Тебя в Гугле забанили?"). А то, что это потребует больше кода и может быть потребует иного алгоритма вычислений, нежели метод трапеций - не важно. Конечно полной универсальности от этого ждать нельзя, но все же интересно посмотреть.
0
Модератор
9656 / 4976 / 3265
Регистрация: 17.08.2012
Сообщений: 15,476
01.04.2019, 04:35 9
ValentinNemo, да зачем всё это? Зачем сложно, если можно просто? Только лишь для того, чтобы "всё было по-честному", что ли? Почти уверен, что в методичке, которую выдали adm_uzу, предлагается оценивать погрешность методом удвоения (или утроения) количества интервалов с последующим сравнением вычисленных значений при n и 2n интервалов. Это что, лучше производных? Типа, если модуль разности станет меньше эпсилон, то нужная точность достигнута. Ага, щаззз. Далеко не для каждой функции это так.

Без производных вообще никак. Либо в явном виде, либо вычисленных численно - никуда от них не денешься, без них оценка погрешности будет недостоверная. Можно уменьшать шаг и вычислять интеграл с любой точностью, не вопрос. Вопрос в том, как эту точность оценить. Иными словами, каким нужно сделать шаг, чтобы требуемая точность вычислений была достигнута.

Что можно сделать для метода трапеций? Для гладких функций (с грехом пополам) можно обойтись только первой производной. Возьмём отдельную трапецию и внимательно посмотрим на её линию, прилегающую к функции. Площадь сегмента между линией трапеции и функцией и есть невязка, и для каждой трапеции она своя. Сумма всех невязок будет (в точности) равна погрешности. Можно взять две трапеции, таких, чтобы для одной из них функция располагалась снаружи трапеции, а для другой - внутри. Для случаев, когда функция полностью располагается с одной стороны от линии трапеции, это сделать сравнительно легко. Нужно "всего лишь" провести касательную к функции в точке, наиболее удалённой от линии трапеции (да-да, это, по факту, вычисление первой производной, пусть численное, не алгебраическое). Разность площадей исходной трапеции и трапеции с касательной (параллелограмм получится) будет гарантированно больше невязки, и можно будет с уверенностью сказать, что, если сумма площадей всех параллелограммов (лучше сказать "параллелограммулечек") не больше погрешности, то заданная точность вычислений достигнута. Да, количество шагов получится раза в полтора-два больше, чем в случае со второй производной, но будет и достоверность. Если функция располагается по обе стороны от линии, то касательные (их будет две) провести будет сложнее, и нужно будет вычислить разницу площадей между трапециями, образованными этими касательными.

В теории это красиво, а по факту вызывает кучу осложнений. Площадь отдельного параллелограммчика примерно ε/n, а эта ε и без того маленькое, где там функция максимально отдалена от хорды на каждом мизерном интервальчике длиною в h умумукаешься искать, разные числа одновременно в разрядную сетку не помещаются, ошибки усечения сплошь и рядом, а о том, что n будет стремиться все на свете int64 побороть, я вообще молчу. Да любой программе в этой теме скормить a=1000, b=10000, ε=0.0000000001, она и подавится.

Я всё ж попробую, только не сейчас. Не очень люблю пялиться в Лазарус на рассвете.
1
2373 / 775 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
01.04.2019, 17:24 10
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Только лишь для того, чтобы "всё было по-честному", что ли?
Нет, конечно. Про заказчика задания уже речи не ведется.
Абсолютно честно признаюсь - не люблю в дебри высшей математики лезть. Слабоват я в этом, ошибки допускаю глупые, над которыми потом не то смеяться, не то плакать надо. Счастливый вы человек в том плане, что оно в вашей голове укладывается.
Поэтому думал думал, и решил так: может кто более умный объяснит как надо сделать более менее универсальную программу, которая вычисляет интеграл "как есть", без дополнительных применений человеческого интеллекта.
Зачем все это нужно?
Это вы нашлись такой внимательный и объясняете, другие за ручку меня водить не будут и ошибки вряд ли искать будут.
Я не математик и программы расчетные меня писать не заставляют. Я исключительно для самообразования интересуюсь. Именно поэтому хотелось бы все это автоматизировать, конечно если это возможно.
То что есть интегралы жутко противные и сложные - я знаю. В универе каждый раз на таком "подрывался".
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Да любой программе в этой теме скормить a=1000, b=10000, ε=0.0000000001, она и подавится.
Полностью согласен. Можно простые числа искать в какой нибудь миллиардной степени - так наверное всего кремния планеты не хватит на такие компьютеры. Только зачем? Обычно 0.001 - это уже хорошо.
Так как вы человек более сведущий в применении высшей математики к числовым методам, то поэтому и обратился.
Спасибо огромное, за то что взялись за такие труды. Не обязательно применять трапеции, не обязательно извращаться со скоростью вычислений. Не нужна и мегаточность. Основная цель - универсальность, как я уже говорил раньше. Написал функцию с вычисляемой формулой, вставил ее в алгоритм, задал границы, нарисовал в ТChart график с заполнением и все.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.04.2019, 17:24
Помогаю со студенческими работами здесь

Вычисление определённого интеграла методом трапеций
Здравствуйте! Помогите составить подпрограмму: вычисление определённого интеграла методом...

Вычисление определённого интеграла методами трапеций и Симпсона
Всем привет. Очень нужна помощь с этими интегралами. Не могу создать программу PASCAL. Если не...

Нужна программа вычисления определенного интеграла методом трапеций
\int_{1}^{2}x^2dx

Вычислить значение определенного интеграла методом трапеций.
Вычислить значение определенного интеграла \int_{0.1}^{1}2\ln (x)+\sqrt{2x}\operatorname{d}x


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru