• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Нужно вычислить площадь фигуры. Delphi7

Anastasia12

Новые
Регистрация
12 Ноя 2016
Сообщения
19
Реакции
0
Баллы
0
Нужно вычислить площадь фигуры. 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.
 
Для функции y = x + 1 не нужны ни трапеции, ни Симпсон.
 
мне не важна здесь функция. главное чтобы программа правильная была
 
Ну вот, что-то сотворил. Но только на Паскале. Всякие там дельфийские формы - это уж Вы самостоятельно.
Несколько замечаний:
1. Смысл сентенции
Использовать полученное значение при вычисление той же площади по правилу Симпсона
мне абсолютно непонятен. Каким образом можно результат по трапециям "использовать"? Я просто провёл интегрирование по трапециям и Симпсону с нахождением числа разбиений, чтобы выполнялось условие сходимости.
2. Здесь
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.
 
Назад
Сверху