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


Ответ
 
Опции темы Опции просмотра
Старый 09.04.2017, 11:19   #1 (permalink)
Anastasia12
Member
 
Регистрация: 12.11.2016
Сообщений: 19
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Нужно вычислить площадь фигуры. Delphi7

помогите, пожалуйста, доработать программу
Задание: Вычислить приближенно площадь фигуры между осью абсцисс и кривой, заданной функцией с одним аргументом y=f(x) в пределах между x=x0 и x=x .
Указания:

2. Отрезок разделить на n равных частей;
3. Часть площади между x0 и x вычислить по формуле трапеций
S=(f(x0)+f(x1))(x1-x0)/2 ;
4. Аналогичную формулу применить и для других промежутков. Обнаружить, при каких n в результате не изменяются первые 6 десятичных знаков;
5. Организовать цикл WHILE, такой, чтобы из него можно было получить число n , обеспечивающего заданную точность EPS вычисления площади;
6. Всем выбрать различные функции и отрезок интегрирования;
7. На печать вывести значения площади и требуемое число , при котором обеспечивается заданная точность;
8. Использовать полученное значение при вычисление той же площади по правилу Симпсона
S=(f(x0)+4f(x1)+f(x2))delta(x) ,
Здесь delta(x) ─ расстояние между соседними точками;
Код:
uses
  SysUtils;

const
  x0=4;
  xk=6;
  eps=1E-10;
 var n,k,i:integer;
 s,x,h,s1,x1:real;
function f(y:real):real;
begin
f:=y+1;
end;
begin
 n:=1;
 s:=(f(x0)+f(xk))*(xk-x0)/2;
repeat
 s1:=s;
 n:=n+1;
 h:=(xk-x0)/n;
 x:=x0;
 for i:=1 to n do
 begin
 x1:=x+h;
 s:=f(x)+f(x1)+s;
 x:=x1;
 end;
 s:=s*h/2;
 writeln('s=',s:2:10);
 writeln('s1=',s1:2:10);

until abs(s-s1)<=eps;
 writeln('n=',n);
 readln;
   { TODO -oUser -cConsole Main : Insert code here }
end.
Anastasia12 вне форума   Ответить с цитированием

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

Мой вам совет - поищите ответы в аналогичных обсуждениях

Найти площадь фигуры
Игру на Delphi7 ?
Площадь фигуры

Старый 09.04.2017, 11:23   #2 (permalink)
Viewer
Banned
 
Регистрация: 06.03.2017
Сообщений: 788
Сказал(а) спасибо: 0
Поблагодарили 18 раз(а) в 4 сообщениях
Репутация: 5680
По умолчанию

Для функции y = x + 1 не нужны ни трапеции, ни Симпсон.
Viewer вне форума   Ответить с цитированием
Старый 09.04.2017, 11:25   #3 (permalink)
Anastasia12
Member
 
Регистрация: 12.11.2016
Сообщений: 19
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

Ну вот, что-то сотворил. Но только на Паскале. Всякие там дельфийские формы - это уж Вы самостоятельно.
Несколько замечаний:
1. Смысл сентенции
Цитата:
Сообщение от Anastasia12 Посмотреть сообщение
Использовать полученное значение при вычисление той же площади по правилу Симпсона
мне абсолютно непонятен. Каким образом можно результат по трапециям "использовать"? Я просто провёл интегрирование по трапециям и Симпсону с нахождением числа разбиений, чтобы выполнялось условие сходимости.
2. Здесь
Цитата:
Сообщение от Anastasia12 Посмотреть сообщение
S=(f(x0)+4f(x1)+f(x2))delta(x) ,
Здесь delta(x) ─ расстояние между соседними точками;
как всегда в методичках, безграмотность и враньё (они просто не могут без этого). Множитель в формуле Симпсона есть delta(x)/3.
3. Раз уж эти учёные мужи и мужини требуют всенепременно While, то пусть подавятся. Я, кстати, тоже предпочитаю Repeat Until.
4. Для красоты и хорошего тона добавлено вычисление первообразной (функция Antider), что позволяет сопоставить результат численного интегрирования с точным значением.
5. Естественно, функцию и пределы можете взять свои.
Код:
const
 x0=2;
 xk=3;
 eps=1E-7;

var
 n,i:integer;
 s,x,h,s1,x1,delta:real;

function f(y:real):real;
begin
 f:=-y*y*3+y*15-18;
end;

function Antider(y:real):real;
 begin
  Antider:=-y*y*y+y*y*15/2-y*18;
 end;

Begin
 n:=2;
 s:=(f(x0)+f((x0+xk)/2))*(xk-x0)/4+(f((x0+xk)/2)+f(xk))*(xk-x0)/4;
 delta:=1;
 While delta>eps do
  begin
   s1:=s;
   n:=n+2;
   h:=(xk-x0)/n;
   x:=x0;
   s:=0;
   for i:=1 to n do
    begin
     x1:=x+h;
     s:=f(x)+f(x1)+s;
     x:=x1;
    end;
   s:=s*h/2;
   delta:=abs(s-s1);
  end;
 writeln('Trapezium:');
 writeln('s = ',s:0:10);
 writeln('s1= ',s1:0:10);
 writeln('n= ',n);
 writeln;

 n:=2;
 s:=(f(x0)+f((x0+xk)/2)*4+f(xk))*(xk-x0)/6;
 delta:=1;
 While delta>eps do
  begin
   s1:=s;
   n:=n+2;
   h:=(xk-x0)/n;
   x:=x0;
   s:=0;
   for i:=1 to (n div 2) do
    begin
     x1:=x+h*2;
     s:=f(x)+f(x+h)*4+f(x1)+s;
     x:=x1;
    end;
   s:=s*h/3;
   delta:=abs(s-s1);
  end;
 writeln('Simpson:');
 writeln('s = ',s:0:10);
 writeln('s1= ',s1:0:10);
 writeln('n= ',n);
 writeln;
 Write('Accurate value: ');
 Writeln((Antider(xk)-Antider(x0)):0:10);
 Readln
End.
Vladimir_S вне форума   Ответить с цитированием
Старый 10.04.2017, 05:14   #5 (permalink)
Anastasia12
Member
 
Регистрация: 12.11.2016
Сообщений: 19
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

спасибо большое
Anastasia12 вне форума   Ответить с цитированием
Ads

Яндекс

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


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

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




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

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