Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Программа считающая производную функции

Автор: Dex 9.12.2003 18:58

Люди я тут новичёк и поэтому сразу не убивайте.
Мне по  информатики задали составить программку считающую производную функции
по математики я примерно помню как это делается ,а вот чтоб в паскале написать ,мне
слабо.
Может кто знает где готовую достать ,или сам когда-то писал ,буду очень благодарен за любую помощь.

Автор: Nemo 9.12.2003 19:21

Уточни, как будет задаваться функция: табличными значениями или просто, вводится с клавиатуры как строка. В первом случае проблем нет: математики придумали кучу алгоритмов нахождения производной (ее  конкретного числового значения), а во втором случае... не завидую.
   

Автор: Dex 10.12.2003 1:29

Надо будет задавать функцию которой будет считаться производная
Напримен задаётся функция
f(x)=3x(в третей)+2x(в квадрате) ,кстати х в третей пишится x^3?
и получаем в конце программы результат
f'(x)=9x^2+4x
это вродибы не так сложно но но я не знаю как с степенью работать
и табличные значения как вносить?

Автор: trminator 10.12.2003 13:05

Подожди. Задается совсем уж произвольная функция (логарифмы там, деления всякие, сложные функции) или только многочлен? С многочленом все намного проще...

Автор: Dex 10.12.2003 23:40

Логарифмы ,косинусы  тоже должны присутствовать все  табличные значения
(Sin(x))'=cos(x)
(ln(x))'=1/x
(cx)'=c
итд.
Может кто подскажет как это сделать.

Автор: zx1024 11.12.2003 0:19

Разобрать выражение на элементарные ф-ции и подсчитать производную от каждой (по таблице).
В случае сложной ф-ции использовать рекурсию.
Надо просто запрограммировать математические правила подсчёта производной.

Автор: trminator 11.12.2003 1:00

Сначала опять-таки придется построить дерево разбора этого выражения, потом с ним работать по правилам... может, так?

Автор: Dex 11.12.2003 9:52

Не мог бы кто показать на паре примеров как это делается.
например
f(x)=3x^3+4
f(x)=Cos(x)/1+sin(x)
Странно что готовой программы нету .

Автор: fms 11.12.2003 13:44

странно что не подготовились к Вашему вопросу? smile.gif
я думаю что если ты поковыряешься в инете.. то найдешь немало вариантов.. попробуй.

Автор: Dex 11.12.2003 16:55

Я пробывал но ничего толкового не нащёл ,нету табличных значений
Может подскажеш где.

Автор: Dex 13.12.2003 14:49

Люди куда все делись?

Автор: oleg309 13.12.2003 15:38

Спим... ;)

Автор: sca 13.12.2003 21:19

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

f'(x)=lim[dx->0] df(x)/dx

Автор: Dex 13.12.2003 21:54

Может проснётесь ,мне до вторника её надо сделать.
Help.

Автор: LinkIn 13.12.2003 23:14

Может ты что-то путаешь? ???  Ведь тогда эта прога должна не только
уметь считать производную, но и понимать функции, которые задаются в виде строк. Сложновато для обычной лабы!
На странице  http://borodingo.narod.ru/done/ есть пример программы
на паскале, который наз-ся "Получение формулы производной по формуле функции" может поможет? Конкретная ссылка на скачивание: http://borodingo.narod.ru/done/distrib/Postfix.zip
Но, чтобы переписать ее тебе понадобится не одна общая тетрадь! smile.gif

Автор: anka 29.12.2003 1:12

переделай чуть чуть, она больше делает чем надо=)

Код

program task3(input,output);
var x,xn,xk,dx,h,hv:real;
k:integer;
function f(x:real):real;
begin f:=x*x*x-3*x;end;
function fpr1(x:real):real;
begin fpr1:=3*x*x-3;end;
function fpr2(x:real):real;
begin fpr2:=3*x*x-3; end;
function fprL(x,h:real):real;
begin fprL:=(f(x+h)-f(x))/h; end;
function fprR(x,h:real):real;
begin fprR:=(f(x)-f(x-h)); end;
function y4(x:real):real;
begin y4:=(fprL(x,h)+fprR(x,h))/2; end;
function fpr(x:real):real;
begin if x>=0 then fpr:=fpr1(x) else fpr:=fpr2(x); end;
procedure prmax(y6,y7,x:real;var max,xmax,ymax:real);
begin
   if max<=y6 then begin max:=y6; xmax:=x; ymax:=f(x);end;
   if max<=y7 then begin max:=y7; xmax:=x; ymax:=f(x);end;
end;
procedure main(xn,xk,dx,h:real);
  var
   i:integer;
   y,max,xmax,ymax,y5,y6,y7:real;
 begin
   writeln('pri h= ',h:5:5);
   i:=0;x:=xn;
   max:=abs(fprL(xn,h)-fpr(xn));
   xmax:=xn; ymax:=f(x);
   writeln(' x  y y1=f`L y2=f`R y3=f` y4=(f`L+f`R)/2 |y4-y3| |y1-y3| |y2-y3|');
   while(i<100) and (x<=xk+dx/2) do
   begin
      y5:=abs(y4(x)-fpr(x));
      y6:=abs(fprL(x,h)-fpr(x));
      y7:=abs(fprR(x,h)-fpr(x));
      writeln(' ',x:2:1,' ',f(x):1:2,' ',fprL(x,h):1:2,' ',fprR(x,h):1:2,' ',fpr(x):1:2,y4(x):1:2,y5:1:2,y6:1:2,y7:1:2);
      prmax(y6,y7,x,max,xmax,ymax);
      x:=x+dx;
      i:=i+1;
    end;
   writeln('maksimalnoe otklonenie=',max:5:2,'pri x=',xmax:5:2,'y=',
   ymax:5:2);
    end;
     begin
      write('Vvedite xn,xk,dx,h');
      readln(xn,xk,dx,hv);
      k:=1;
      repeat
       case k of
        1:begin h:=dx/10; k:=k+1; main(xn,xk,dx,h) end;
        2:begin h:=dx/100; k:=k+1; main(xn,xk,dx,h); end;
        3:begin h:=hv; k:=k+1; main(xn,xk,dx,h); end;
     end;
     until k>3;
     readln;
     end.