Как найти производную на паскале

//Вычисление производных
 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-ую производную, если это возможно. Если она больше нуля, то функция выпуклая на интервале и экстремум существует.

Основная сложность написания такой программы – трудоемкость.

__________________
Доказать – значит громко повторить сказанное…

>
процедура нахождения производной….



Сообщ.
#1

,
29.11.04, 23:26

    люди у кого есть идеи по написанию процедуры нахождения производной или первообразной


    DoctorGenius



    Сообщ.
    #2

    ,
    30.11.04, 00:53

      Junior

      *

      Рейтинг (т): 7

      Следует заметить, что символьная математика на Паскале является довольно сложным делом. Если для нахождения производных можно написать программу, которая будет делать это более-менее успешно, то для нахождения первообразной существует лишь некоторая совокупность правил, и в отличие от производной первообразная может просто не выражаться через элементарные функции, например интеграл от sin(x)/x. В аналитическом виде первообразная существует лишь для некоторых классов функций. Поэтому вычислять интеграл в аналитическом виде дело неблагодарное. В свое время я уже поднимал эту проблему, чем закончились обсуждения по написанию программы для символьного интегрирования – см. здесь Помогите разработать алгоритм.
      На практике применяются численные методы дифференцирования и интегрирования, которые дают не точные, а приближенные решения.
      А вообщем вот что есть по существу:
      1. Вычисление производной в аналитическом виде:

      ExpandedWrap disabled

        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-й производной в численном виде.

      ExpandedWrap disabled

        { Вычисление 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. Численное интегрирование.

      ExpandedWrap disabled

        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



      Сообщ.
      #3

      ,
      30.11.04, 02:15

        Имхо, пора это наконец в фак

        Сообщение отредактировано: Vesper – 30.11.04, 06:06

        0 / 0 / 0

        Регистрация: 17.02.2012

        Сообщений: 16

        1

        Значение производной функции

        17.02.2012, 20:20. Показов 6615. Ответов 6


        Студворк — интернет-сервис помощи студентам

        Доброго времени суток друзья. Я новичок во всех смыслах этого слова: как на форуме, так и в программировании. Начал изучать в универе программирование и алгоритмизацию и сразу лаб работа и я в тупике(((
        Будьте добры, помогите написать программу для вычисления значения производной функции x^x в заданной точке а (a>0). Заранее благодарю!



        0



        artUK_off

        16 / 16 / 9

        Регистрация: 03.06.2011

        Сообщений: 59

        18.02.2012, 02:49

        2

        Pascal
        1
        2
        3
        4
        5
        6
        7
        8
        
        uses crt;
        var f, a:real;
         begin
          write('введите точку а =');
          readln(a);
          f:=2*a;
          writeln('знаение производной в точке а =',f);
         end.



        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,
        прав, мне нужно x^x, это немного сложнее, поэтому обратился на форум…ладно будем думать дальше



        0



        thyrex

        Вирусоборец

        11416 / 6515 / 1351

        Регистрация: 06.09.2009

        Сообщений: 24,650

        18.02.2012, 21:34

        5

        Pascal
        1
        2
        3
        4
        5
        6
        7
        
        var f, a:real;
        begin
         write('Введите а: ');
         readln(a);
         f:=Power(a, a)*(ln(a)+1);
         writeln('Значение производной в точке а = ', f:0:2);
        end.



        1



        artUK_off

        16 / 16 / 9

        Регистрация: 03.06.2011

        Сообщений: 59

        18.02.2012, 21:38

        6

        Pascal
        1
        2
        3
        4
        5
        6
        7
        8
        
        uses crt;
        var f,a:real;
         begin
          write('введите точку а =');
          readln(a);
          f:=(ln(a)+1)*power(a,a);
          writeln('значение производной в точке а =',f);
         end.

        да мой косяк был ссори



        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 производной (предела) функции
        Первая функция- f(x)=4^x-sqrt(x)
        Вторая функция- f(x)=sqrt(1+cos(x)/1-cos(x))

        Вычислить значение многочлена a0x^n+a1x^n-1+…+an-1x+an и его производной в точке x = 0.5.
        Даннo натуральное число n и, действительные числа x, a0, a1, …, an. Вычислить значение многочлена…

        Вычисление первой и второй производной табличной функции.
        Написать программу вычисления первой и второй производной табличной функции с помощью полинома…

        По заданным вещественным числам a(0),a(1) ,…,a(20), T вычислить значения многочлена a(20)*x^20+a(19)*x^19+…+a(1)*x+a(0) и значение его производной
        По заданным вещественным числам a(0),a(1) ,…,a(20), T вычислить значения многочлена…

        Искать еще темы с ответами

        Или воспользуйтесь поиском по форуму:

        7

        Добавить комментарий