09.04.2017, 11:19 | #1 (permalink) |
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. |
09.04.2017, 11:19 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Мой вам совет - поищите ответы в аналогичных обсуждениях Найти площадь фигуры Игру на Delphi7 ? Площадь фигуры |
09.04.2017, 20:02 | #4 (permalink) | ||
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Ну вот, что-то сотворил. Но только на Паскале. Всякие там дельфийские формы - это уж Вы самостоятельно.
Несколько замечаний: 1. Смысл сентенции Цитата:
2. Здесь Цитата:
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. |
||
10.04.2017, 05:14 | #5 (permalink) |
Member
Регистрация: 12.11.2016
Сообщений: 19
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
спасибо большое
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|