//Вычисление производных Program dif; var x,dx:real; var y1x,y2x:real; Function f1(t:real):real; //первая функция begin result:=(2-cos(t))/(3+sin(t)); end; Function f2(t:real):real; //вторая функция begin result:=(exp(t)-exp(-t))/2; end; Procedure f12(x:real;f: real -> real); //Процедура расчета первой и второй производных функции var r0,r1,r2:real; begin r0:=f(x); r1:=f(x-dx); r2:=f(x+dx); y1x:=(r2-r1)/2/dx; y2x:=(r1-2*r0+r2)/dx/dx; end; Begin dx:=0.00001; //приращение аргумента (можно менять) Write(' Введите x = '); read(x); f12(x,f1); Writeln(' Первая производная функции f1 = ',y1x:2:5); Writeln(' Вторая производная функции f1 = ',y2x:2:5); Writeln( ); f12(x,f2); Writeln(' Первая производная функции f2 = ',y1x:2:5); Writeln(' Вторая производная функции f2 = ',y2x:2:5); end.
Отличная программа для вычисления производной функции. Программа написана на Паскале. Вам надо только подставить свою функцию.
{Вычисление производной функции}
program proizvodnaya;
uses crt;
const epsmin=1e-6;
type
func=function(x:real):real;
var
L1,L2, epsilon:real; i:integer;
{$F+}
function ftest(x:real):real;
begin
ftest:=sin(x)
end;
function f1(x:real):real;
begin
if x<>0 then f1:=sin(x)/x else f1:=1;
end;
function df(f:func; a,eps:real):real;
var pme:integer; y1, y2, dx:real;
begin
pme:=-1;y2:=(f(a+5)-f(a))/5;
i:=1;
repeat
y1:=y2;
pme:=pme*(-1);
dx:=pme/i;
y2:=(f(a+dx)-f(a))/dx;
i:=i+1;
until (abs (y2-y1) df:=y2;
end;
Begin
clrscr; epsilon:=1;
writeln('Производная');
repeat
L1:=df(ftest, 0, epsilon);
L2:=df(f1, 0, epsilon);
writeln ('epsilon=', epsilon:8:6,' L1=',L1:8:4,' L2=', L2:8:4);
epsilon := epsilon*0.1;
until epsilon < epsmin;
readln;
End.
Похожие публикации: Pascal
steelik
Когда-то сам искал нечто подобное, найти очень сложно. Пришлось писать самому, благо, моей задачей был анализ численного метода локализации корней и подходила любая функция. Так что, если нужна программа для поиска производной полинома, то всегда пожалуйста
Вообще написать программу, ищущую производную функции – несложная задача. Надо знать таблицу основных элементарщин, арифм. св-ва производной, производную композиции и обратной функции.
А экстремум можно искать исходя из необх. и дост. условий. Т.е. найти первую производную. IF она равна нулю, тогда можно проверить ее знаки при переходе через подозрительную на экстремум точку, либо найти 2-ую производную, если это возможно. Если она больше нуля, то функция выпуклая на интервале и экстремум существует.
Основная сложность написания такой программы – трудоемкость.
__________________
Доказать – значит громко повторить сказанное…
процедура нахождения производной….
|
|
люди у кого есть идеи по написанию процедуры нахождения производной или первообразной |
DoctorGenius |
|
Junior Рейтинг (т): 7 |
Следует заметить, что символьная математика на Паскале является довольно сложным делом. Если для нахождения производных можно написать программу, которая будет делать это более-менее успешно, то для нахождения первообразной существует лишь некоторая совокупность правил, и в отличие от производной первообразная может просто не выражаться через элементарные функции, например интеграл от sin(x)/x. В аналитическом виде первообразная существует лишь для некоторых классов функций. Поэтому вычислять интеграл в аналитическом виде дело неблагодарное. В свое время я уже поднимал эту проблему, чем закончились обсуждения по написанию программы для символьного интегрирования – см. здесь Помогите разработать алгоритм.
program Analize; type diagrams = record ops, text : string; end; const max = 9; all : array [1..max] of diagrams = ( ( ops:’+’; text: ‘($<)+($>)’), ( ops:’-‘; text: ‘($<)-($>)’), ( ops:’*’; text: ‘($<)*(>)+($>)*(<)’), ( ops:’/’; text: ‘(($<)*(>)-($>)*(<))/((>)*(>))’), ( ops:’sin’; text: ‘cos(>)*($>)’), ( ops:’cos’; text: ‘($>)*(-sin(>))’), ( ops:’exp’; text: ‘(($>)*exp(>))’), ( ops:’ln’; text: ‘($>)/(>)’), ( ops:’x’; text: ‘1’) ); var str : string[60]; procedure find_simb (beg,end1:integer;wanted:string;var pos1,pos2:integer); var i,bc,k,n : integer; fl : boolean; begin bc := 0; n:=Length(wanted); for i:=beg to end1 do begin fl:=true; for k:=0 to n-1 do if (str[i+k]<>wanted[k+1]) then begin fl := false; break end; if((fl)and(bc=0)) then break; if (str[i]='(‘) then Inc(bc); if (str[i]=’)’) then Dec(bc); end; pos1:=i; pos2:=i+n-1; if not(fl) then pos2:=end1+1; end; function df(beg,end1:integer):string; var st,sx,cur_adr : string; ch : char; i,j,pos1,pos2,uk : integer; begin st:=”;sx:=”; if (str[beg]='(‘) then begin find_simb(beg+1,end1,’)’,pos1,pos2); if (pos2>end1-1) then begin df := df(beg+1,pos2-1); exit end; end; for i:=1 to max do begin find_simb(beg,end1,all[i].ops,pos1,pos2); if(pos2<=end1) then begin cur_adr:=all[i].text; uk := 0; while (uk<Length(cur_adr)) do begin Inc(uk); ch := cur_adr[uk]; case ch of ‘$’ : begin Inc(uk); ch:=cur_adr[uk]; if (ch='<‘) then sx:=df(beg,pos1-1) else sx:=df(pos2+1,end1); end; ‘<‘ : begin for j:=beg to pos1-1 do sx[j-beg+1]:=str[j]; sx[0]:=chr(pos1-beg); end; ‘>’ : begin for j:=pos2+1 to end1 do sx[j-pos2]:=str[j]; sx[0]:=chr(end1-pos2); end; else sx:=ch; end; { case } st:=st+sx; end; { while } df:=st; exit; end; { if } end; { for } df:=’0′; end; { df } begin Readln(Str); while Str<>” do begin Writeln( df(1, Length(Str)) ); Readln( Str ); end; end. 2. Нахождение 1-й и 2-й производной в численном виде.
{ Вычисление 1-й производной и опред. точности ее вычислен.} { derivative – производная } Function derivat1(x0, eps : real) : real; var dx, dy, dy2 : real; begin dx := 1; repeat dx := dx/2; dy := fx(x0 + dx/2) – fx(x0 – dx/2); dy2 := fx(5*x0/4 + dx) – 2*fx(5*x0/4); dy2 := dy2 + fx(5*x0/4 – dx) until abs((dy2*dy2*fx(x0))/(2*dx)) < eps; derivat1 := dy/dx end; { Функция вычисления второй производной } Function derivat2(x0, eps : real) : real; var dx, dy, dy3 : real; begin dx := 1; repeat dx := dx/2; dy := fx(x0 + dx) – 2*fx(x0) + fx(x0 – dx); dy3 := fx(5*x0/4 + 2*dx) – 2*fx(5*x0/4 + dx); dy3 := dy3 – fx(5*x0/4 – 2*dx) + 2*fx(5*x0/4 – dx) until abs(dy3/(6*dx)) < eps; derivat2 := dy/(dx*dx) end; 3. Численное интегрирование.
program Integral; {$APPTYPE CONSOLE} // численное интегрирование // e-mail: doctorgenius@mail.ru type real_fun = function (x: real): real; function leftrect(f: real_fun; a,b,eps: real): real; // метод левых прямоугольников var h,s,s1: real; i,n: integer; begin s:=0; n:=1; repeat s1:=s; s:=0; n:=n*2; h:=(b-a)/n; for i:=0 to n-1 do s:=s+f(a+i*h); s:=s*h; until abs(s1-s)<3*eps; leftrect:=s; end; function rightrect(f: real_fun; a,b,eps: real): real; // метод правых прямоугольников var h,s,s1: real; i,n: integer; begin s:=0; n:=1; repeat s1:=s; s:=0; n:=n*2; h:=(b-a)/n; for i:=1 to n do s:=s+f(a+i*h); s:=s*h; until abs(s1-s)<3*eps; rightrect:=s; end; function middlerect(f: real_fun; a,b,eps: real): real; // метод средних прямоугольников var h,s,s1: real; i,n: integer; begin s:=0; n:=1; repeat s1:=s; s:=0; n:=n*2; h:=(b-a)/n; for i:=0 to n-1 do s:=s+f((a+i*h)+(h/2)); s:=s*h; until abs(s1-s)<3*eps; middlerect:=s; end; function trapeze(f: real_fun; a,b,eps: real): real; // метод трапеций var h,s,s1: real; i,n: integer; begin s:=0; n:=1; repeat s1:=s; s:=0; n:=n*2; h:=(b-a)/n; for i:=0 to n-1 do s:=s+(f(a+i*h)+f(a+(i+1)*h))/2; s:=s*h; until abs(s1-s)<eps; trapeze:=s; end; function Simpson(f: real_fun; a,b,eps: real): real; // метод парабол (метод Симпсона) var h,s,s1,z: real; i,n: integer; begin s:=0; n:=1; repeat s1:=s; s:=0; n:=n*2; h:=(b-a)/n; z:=h/2; for i:=1 to n do s:=s+(f(a+i*h-2*z)+4*f(a+i*h-z)+f(a+i*h)); s:=s*(z/3); until abs(s1-s)<eps; Simpson:=s; end; function Bode(f: real_fun; a,b,eps: real): real; // метод Боде var h,s,s1,z: real; i,n: integer; begin s:=0; n:=1; repeat s1:=s; s:=0; n:=n*2; h:=(b-a)/n; z:=h/4; for i:=1 to n do s:=s+(7*f(a+i*h-4*z)+32*f(a+i*h-3*z)+12*f(A+i*h-2*z)+32*F(a+i*h-z)+7*F(a+i*h)); s:=s*2*z/45; until abs(s1-s)<eps; Bode:=s; end; function f(x: real): real; // интегрируемая функция begin f:=sin(x); end; var a,b,eps: real; begin write(‘a=’); readln(a); // нижний предел интегрирования write(‘b=’); readln(b); // верхний предел интегрирования write(‘eps=’); readln(eps); // точность вычислений writeln(leftrect(f,a,b,eps)); writeln(rightrect(f,a,b,eps)); writeln(middlerect(f,a,b,eps)); writeln(trapeze(f,a,b,eps)); writeln(Simpson(f,a,b,eps)); writeln(Bode(f,a,b,eps)); readln; end. |
Eiden |
|
Имхо, пора это наконец в фак Сообщение отредактировано: Vesper – 30.11.04, 06:06 |
0 / 0 / 0 Регистрация: 17.02.2012 Сообщений: 16 |
|
1 |
|
Значение производной функции17.02.2012, 20:20. Показов 6615. Ответов 6
Доброго времени суток друзья. Я новичок во всех смыслах этого слова: как на форуме, так и в программировании. Начал изучать в универе программирование и алгоритмизацию и сразу лаб работа и я в тупике(((
0 |
artUK_off 16 / 16 / 9 Регистрация: 03.06.2011 Сообщений: 59 |
||||
18.02.2012, 02:49 |
2 |
|||
1 |
11416 / 6515 / 1351 Регистрация: 06.09.2009 Сообщений: 24,650 |
|
18.02.2012, 12:43 |
3 |
artUK_off, речь шла о производной x^x, а не x^2
1 |
0 / 0 / 0 Регистрация: 17.02.2012 Сообщений: 16 |
|
18.02.2012, 18:14 [ТС] |
4 |
artUK_off, вы мне для x^2 написали? благодарю конечно за уделенное время, но thyrex,
0 |
thyrex 11416 / 6515 / 1351 Регистрация: 06.09.2009 Сообщений: 24,650 |
||||
18.02.2012, 21:34 |
5 |
|||
1 |
artUK_off 16 / 16 / 9 Регистрация: 03.06.2011 Сообщений: 59 |
||||
18.02.2012, 21:38 |
6 |
|||
да мой косяк был ссори
1 |
0 / 0 / 0 Регистрация: 17.02.2012 Сообщений: 16 |
|
19.02.2012, 09:04 [ТС] |
7 |
Огромное спасибо друзья то что надо
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
19.02.2012, 09:04 |
Помогаю со студенческими работами здесь Вычесление 1 и 2 производной (предела) функции Вычислить значение многочлена a0x^n+a1x^n-1+…+an-1x+an и его производной в точке x = 0.5. Вычисление первой и второй производной табличной функции. По заданным вещественным числам a(0),a(1) ,…,a(20), T вычислить значения многочлена a(20)*x^20+a(19)*x^19+…+a(1)*x+a(0) и значение его производной Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 7 |