![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Negor |
![]()
Сообщение
#1
|
Гость ![]() |
Вот написал тут свой первый модуль.По задумке с его помощью
можно возводить в степень как в с++ с помощью функции pow(), и выполнять численное интегрирования 4 методами. Но в возведении в степень чего то не хватает, не пойму чего.А ответы совпадают только у метода симпсона и правых прямоугольников, и то если использовать только тригонометрические функции в противном случае - Float Overflow. Помогите кто-нибудь доработать. Код unit math; {$F+} interface type func=function(x:real):real; Tmethod=procedure(a,b:real;n:byte; var x,EoI,h:real); {Metod integrirovanija} {Pryamougolnikami.EoI-} {End Of Iteration } function pow(x,n:real):real; {Vozvedenie 'X' v stepen 'N'} function SimpsonDx(f:func;a,b:real;n:byte):real;{Opred.Integral metodom Simpsona} function Dx(method:Tmethod;f:func;a,b:real;n:byte):real;{Opred.Integral metodom Pryamougolnikov} procedure Left(a,b:real;n:byte; var x,EoI,h:real); {\ } procedure Right(a,b:real;n:byte; var x,EoI,h:real);{ |-Metodi integrirovanija pryamougolnikami} procedure Middle(a,b:real;n:byte; var x,EoI,h:real);{/ } implementation function pow(x,n:real):real; var _x:real; _n:integer; begin _n:=trunc(n); if (x<0) and (n-_n=0) then if (n>0) and ((_n mod 2)=0) then _x:=1 else _x:=-1 else if n=0 then pow:=1 else pow:=exp(n*ln(abs(x))); end; function SimpsonDx(f:func; a,b:real; n:byte):real; var h,integ,x:real; i:byte; begin if (n mod 2)>0 then inc(n); h:=(b-a)/n; integ:=F(a)+F(b)+4*F(a+h); for i:=1 to (n div 2)-1 do begin x:=a+2*h*i; integ:=integ+2*F(x)+4*F(x+h); end; SimpsonDx:=h*integ/3; end; procedure Left(a,b:real;n:byte; var x,EoI,h:real); begin h:=(b-a)/n; x:=x+a; eoi:=b; end; procedure Right(a,b:real;n:byte; var x,EoI,h:real); begin h:=(b-a)/n; x:=a; eoi:=b-h; end; procedure Middle(a,b:real;n:byte; var x,EoI,h:real); begin h:=(b-a)/n; x:=a+h/2; eoi:=b-h/2; end; function Dx(method:Tmethod;f:func;a,b:real;n:byte):real; var x,h,_dx,eoi:real; begin method(a,b,n,x,eoi,h); repeat _dx:=_dx+h*f(x); x:=x+h; until x>eoi; Dx:=_dx; end; begin end. |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 20:18 |