Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 27.02.2019, 10:47   #1 (permalink)
Alessandro4
Member
 
Регистрация: 27.02.2019
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Question Подынтегральная функция методом Симпсона

Помогите с задачей и объясните ее доступным для новичка языком

Задача: вычисление определённых интегралов и табулирование первообразных функций

Все что мне известно:

Подынтегральная функция - 1/x*ln*x
Промежуток интеграла - [2;3]
Кол-во частей разбивки - 36
Вычисление значения первообразной h - 0,2
Точность вычисления значения первообразной - 0,001
Точное значение первообразной - 2,3026(ln ln x - ln ln 2)
Миниатюры
e79db336-781f-42c6-a59d-113a68255ab7.jpeg  
Alessandro4 вне форума   Ответить с цитированием

Старый 27.02.2019, 10:47
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Суть содержания этой темы схожа с этими темами

Си, функция
Turbo Pascal, метод Симпсона
Функция DEP?
Функция

Старый 27.02.2019, 10:51   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Да легко, сейчас нарисую.
Vladimir_S вне форума   Ответить с цитированием
Старый 27.02.2019, 11:31   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Значит, так.
Прежде всего — методичка составлена бестолково и ошибками. В частности, откуда взялся множитель 2,3026 — совершенно не представляю. А так — пожалуйста:
Код:
Const
 a=2.0;
 Eps=0.001;
 h=0.2;

Var
 x:Real;
 j:Byte;

Function F(p:Real):Real;
begin
 F:=1.0/(p*ln(p));
end;

Function Antiderivative(p:Real):Real;
begin
 Antiderivative:=Ln(Ln(p));
end;


Function Simpson(p:Real):Real;
var
 i,N:Integer;
 Sum1,Sum2,t:Real;
begin
 N:=2;
 t:=(p-a)/(2*N);
 Sum1:=(F(a)+F(p))/3*t;
 for i:=1 to N do
  Sum1:=Sum1+4.0*t/3.0*F(a+t*(2*i-1));
 for i:=2 to N do
  Sum1:=Sum1+2.0*t/3.0*F(a+t*(2*i-2));
 Sum2:=Sum1;
 Repeat
  Sum1:=Sum2;
  N:=N*2;
  t:=(p-a)/(2*N);
  Sum2:=(F(a)+F(p))/3*t;
  for i:=1 to N do
   Sum2:=Sum2+4.0*t/3.0*F(a+t*(2*i-1));
  for i:=2 to N do
   Sum2:=Sum2+2.0*t/3.0*F(a+t*(2*i-2));
 Until ABS(Sum2-Sum1)<Eps;
 Simpson:=Sum2;
end;

Begin
 WriteLn('   x     Simpson    Accurate value');
 for j:=1 to 5 do
  begin
   x:=a+h*j;
   WriteLn(x:5:1, '   ',Simpson(x):0:8, '   ',(Antiderivative(x)-Antiderivative(a)):0:8);
  end;
 ReadLn
End.
Миниатюры
aa01.jpg  
Vladimir_S вне форума   Ответить с цитированием
Старый 27.02.2019, 12:16   #4 (permalink)
Alessandro4
Member
 
Регистрация: 27.02.2019
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо вам)) Я как дома буду проверю
А как вам мой вариант решения задачи, помог препод:
Миниатюры
227eb7e8-da5a-4a2e-92be-f87633dad5f7.jpeg  
Alessandro4 вне форума   Ответить с цитированием
Старый 27.02.2019, 12:47   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Alessandro4 Посмотреть сообщение
А как вам мой вариант решения задачи
Извините, но вижу лишь обрывок весьма, мягко говоря, странного кода. Симпсоном тут и не пахнет.
Цитата:
Сообщение от Alessandro4 Посмотреть сообщение
Я как дома буду проверю
А что проверять? Я ж выложил результат работы программы.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 27.02.2019, 14:07   #6 (permalink)
Alessandro4
Member
 
Регистрация: 27.02.2019
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Большое вам спасибо!
Я больше имел в виду что изучу ее, чтоб суметь грамотно объяснить преподавателю
Alessandro4 вне форума   Ответить с цитированием
Старый 27.02.2019, 14:10   #7 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Alessandro4 Посмотреть сообщение
Я больше имел в виду что изучу ее, чтоб суметь грамотно объяснить преподавателю
Удачи! И обращайтесь, если потребуются с моей стороны какие-то объяснения.
Vladimir_S вне форума   Ответить с цитированием
Старый 27.02.2019, 23:27   #8 (permalink)
Alessandro4
Member
 
Регистрация: 27.02.2019
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Ладно, пытался я значит сам разобраться, но что то не очень, выходит
Объясните, пожалуйста, ваши блоки и сам метод)
Alessandro4 вне форума   Ответить с цитированием
Старый 28.02.2019, 10:47   #9 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Alessandro4 Посмотреть сообщение
Объясните, пожалуйста, ваши блоки и сам метод)
Пожалуйста.
Интеграл берется аналитически, и первообразная (кстати, в методичке, как обычно бывает, это слово употреблено безграмотно, на самом деле первообразная, она же "неопределенный интеграл", это функция, дифференцирование которой даёт подынтегральное выражение, поэтому первообразная определяется с точностью до произвольной константы) есть
Ln(Ln(x))+С.
Отсюда определенный интеграл с переменным верхним пределом (который эти умники называют "первообразной") есть
Ln(Ln(x)) - Ln(Ln(a)).
Уж откуда эти ... взяли числовой коэффициент — не ведаю. Впрочем, догадываюсь: скорее всего, подынтегральная функция предполагалась не 1/(xLn(x)), как у них в таблице, а 1/(xLg(x)), т.е. с десятичным, а не натуральным логарифмом. Тогда действительно возникает коэффициент Ln(10). Идиоты!
Всё это считается в программе через функцию Antiderivative.

Теперь, собственно, о численном интегрировании.

1. Вспомним формулу Симпсона для вычисления интеграла на промежутке (a,b):
а) разбиваем промежуток на 2N частей (тут важна чётность).
б) вводим
h = (b - a)/(2N)
Xj = a + h*j, j = 0, 1, ... 2N
Yj = f(Xj), где f — подынтегральная функция.
тогда интеграл есть
(h/3)*(Y0 + 4*Y1 + 2*Y2 + 4*Y3 + ... + Y2N)

2. Тут опять "уважаемые" преподаватели бьют бедных студиозусов ключом (разводным или шведским) по голове. Видите ли, можно либо зафиксировать число разбиений интервала, тогда точность — уж как получится, либо задать точность и дробить интервал до тех пор, пока мы этой точности не достигнем. А то и другое сразу, как предписывают эти корифеи, НЕВОЗМОЖНО. Поэтому я выбрал второй вариант — вычисление интеграла с заданной точностью. Вычисление делается в функции Simpson.

3. В этой функции организован следующий цикл:
а) Вычисляется значение интеграла при 2N = 2. Обозначим это значение Sum1.
б) Удваиваем N и повторяем вычисление. Получаем величину Sum2.
в) Если |Sum1-Sum2|< ε, то на этом заканчиваем, в противном случае величине Sum1 присваиваем значение Sum2, снова вдвое дробим интервал и повторяем вычисление, в результате которого получаем новое значение Sum2, которое сравниваем с Sum1.
г) Делаем так до тех пор, пока не выполнится условие малости разницы результатов двух итераций.

Далее в программе сделан вывод таблицы результатов, где сопоставляется значение численного расчета при изменении верхнего предела интеграла с точным значением.
Vladimir_S вне форума   Ответить с цитированием
Старый 04.03.2019, 03:00   #10 (permalink)
Alessandro4
Member
 
Регистрация: 27.02.2019
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Код:
 begin
1  N:=2;
2  t:=(p-a)/(2*N);
3  Sum1:=(F(a)+F(p))/3*t;
4  for i:=1 to N do
5   Sum1:=Sum1+4.0*t/3.0*F(a+t*(2*i-1));
6  for i:=2 to N do
7   Sum1:=Sum1+2.0*t/3.0*F(a+t*(2*i-2));
8  Sum2:=Sum1;
9  Repeat
10   Sum1:=Sum2;
11   N:=N*2;
12  t:=(p-a)/(2*N);
13   Sum2:=(F(a)+F(p))/3*t;
14  for i:=1 to N do
15   Sum2:=Sum2+4.0*t/3.0*F(a+t*(2*i-1));
16   for i:=2 to N do
17   Sum2:=Sum2+2.0*t/3.0*F(a+t*(2*i-2));
18 Until ABS(Sum2-Sum1)<Eps;
19  Simpson:=Sum2;
20 end;
Спасибо за разъяснение, но многое мне, конечно, не понятно
Кстати и препод сказал, что вы ошиблись хех, да да... а именно в строчке - 7, опираясь на формулу сказал, что "-2" не должно там быть и попросил меня понять как работает весь этот цикл > объяснить ему > сдать, ибо мое объяснение его не особо удовлетворило. Объясните, пожалуйста, все строчки, если вас не затруднит, ибо в методе симпсона и в самих интегралах я не очень, желательно разжевав) Еще раз огромное спасибо)
Alessandro4 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 09:57.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.