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

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

Форум «Всё о Паскале» _ Задачи _ Определенный интеграл

Автор: PUMA 19.06.2010 22:18

Для заданных границ интегрирования a и b вычислите значение определенного интеграла следующего вида (используя рекурсию) mega_chok.gif
как применить рекурсию? blink.gif помогите пожалуйста

  program r;
uses crt;
var a,b,s,ss,dx,x,p1,p2,p3,p4,p5,p:real;
i,n,m:integer;
begin
clrscr;
write ('a=');
readln (a);
write ('b=');
readln (b);
write ('m>0, m=');
readln (m);
if a<b then dx:=(b-a)/m else dx:=(a-b)/m;
x:=a;
ss:=0;
write ('n=0,1,2,3,...., n=');
readln (n);
if n=0 then for i:=1 to m do ss:=ss+exp(a*x)/a
else if n=1 then for i:=1 to m do begin
p1:=exp(a*x);
p2:=a*sin(b*x);
p3:=b*cos(b*x);
ss:=ss+p1*(p2-p3)/(a*a+sqr(n*b))
end
else while n>=1 do begin
p4:=n*(n-1)*b*b/(a*a+sqr(n*b));
s:=0;
for i:=1 to m do begin
p1:=exp(a*x);
p2:=a*sin(b*x);
p3:=b*cos(b*x);
p5:=exp((n-1)*ln(sin(b*x)));
s:=s+p1*p5*(p2-p3)/(a*a+sqr(n*b));
end;
ss:=ss+n*(n-1)*b*b*s/(a*a+sqr(n*b));
n:=n-2;
end;
writeln ('int=',ss*dx:0:5);
readln;
end.

Правильно ли я вообще решила blush.gif

Автор: Lapp 20.06.2010 5:39

Цитата(PUMA @ 19.06.2010 19:18) *
значение определенного интеграла следующего вида (используя рекурсию) mega_chok.gif
ну и какого же вида? blink.gif
PUMA, ты забыла привести вид, или не смогла? Можно сделать картинкой, а можно просто от руки, типа так:
[интеграл от a до b] scrt(sin (x2))
- верхние и нижние индексы есть в форме ввода, а остальное как сумеешь.

Цитата
как применить рекурсию?
Вообще, применение рекурсии для вычисления интеграла - абсолютная нелепость. Но если надо - покажем.. Я думаю, имеется в виду рекурсивно прибавлять очередной кусочек при суммировании. То есть заменить цикл до m на рекурсию. Это медленно, требует много памяти, некрасиво, но - если такая цель, то можно.. ))

Цитата
Правильно ли я вообще решила blush.gif
Как это можно сказать, не зная, что требуется? ))
Приведи условие - посмотрим. Но, вообще-то, уже и так видно, что есть, что исправлять. И, пока я разглядывал твои вычисления в попытках догадаться, что же это за функция была, у меня возникли большие сомнения в том, что это может быть правильно.. Например - почему у тебя в вычислениях функции присутствуют a и b? как это вообще возможно? функция не может зависеть от пределов интегрирования. Ты уверена, что, например, не интегрируешь первообразную? ))
Давай, ждем вида функции.

Автор: PUMA 20.06.2010 14:37

удалила случайно формулу 10.gif


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: Lapp 20.06.2010 14:47

Цитата(PUMA @ 20.06.2010 11:37) *
удалила случайно формулу
Что это??.. blink.gif


аа...
ну, тогда ясно, где и зачем тут рекурсия...

Добавлено через 5 мин.
Но я тебя должен окончательно разочаровать: нет, твое решение неправильное, и это точно уже ((.

Ты видишь, справа такой же интегральчик, как и слева? Вот отсюда и рекурсия.

Погоди - а ты уверена, что тебе нужен именно определенный интеграл?

Автор: PUMA 20.06.2010 14:56

ну в задании так написано...откуда тогда взялись a и b?
вообще не очень понимаю как и что делать надо blush.gif

Автор: Lapp 20.06.2010 15:06

Цитата
вообще не очень понимаю как и что делать надо blush.gif
Немудрено, я, например, тоже с трудом въезжаю.. Хорошо, давай разбираться )).

Цитата(PUMA @ 20.06.2010 11:56) *
ну в задании так написано...откуда тогда взялись a и b?
a и b - это просто параметры, входящие в функцию. И они, конечно, должны быть заданы, если в итоге требуется числовой ответ.

То, что тут написано - это уже готовая формула интеграла, причем НЕопределенного (только константа у них куда-то затерялась..) То есть численное интегрирование (всякие трапеции и Симпсоны) тут не требуется. Нужно только сделать прогу для расчета по этим формулам.
Стало яснее? )) или продолжить?

P.S.
если можно, приведи условие поточнее.

Автор: PUMA 20.06.2010 15:24

продолжить blink.gif как куда рекурсию применить

в задании только написано:Для заданных границ интегрирования a и b вычислите значение определенного интеграла следующего вида (используя рекурсию) и дана эта огроменная формула..мало того она еще с опечатками была дана mad.gif

Автор: Lapp 20.06.2010 15:41

Цитата(PUMA @ 20.06.2010 12:24) *
продолжить blink.gif как куда рекурсию применить

в задании только написано:Для заданных границ интегрирования a и b вычислите значение определенного интеграла следующего вида (используя рекурсию) и дана эта огроменная формула..мало того она еще с опечатками была дана mad.gif
С какими опечатками? ты уверена?

Если a и b - пределы, то либо это интеграл чего-то еще, либо я персидский шах..

Вот, смотри, я наборсал тут функцию по этой формуле. В ней рекурсия есть - видишь? Функция IntPow - вспомогательная, вычисляет целую степень.
Копирую сюда без отладки, извини уж..
Спрашивай, где непонятно.
function IntPow(x: double; n: integer): double;
var
r: double;
begin
r:=1;
if n<0 then begin
n:=-n;
x:=1/x
end;
while n>0 do r:=r*x;
IntPow:=r
end;


function IntEAXSINNBX(a,b,x: double; n: integer): double;
begin
case n of
0: IntEAXSINNBX:= Exp(a*x)/a;
1: IntEAXSINNBX:= Exp(a*x)*(a*Sin(b*x)-b*Cos(b*x))/(a*a+b*b);
else IntEAXSINNBX:=
(Exp(a*x)*IntPow(Sin(b*x),n-1)*(a*Sin(b*x)-b*Cos(b*x)) +
n*(n-1)*b*b*IntEAXSINNBX(a,b,x,n-2))/ {вот тут рекурсивный вызов}
(a*a+n*n*b*b)
end
end;


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

Автор: PUMA 20.06.2010 15:54

1)Там где n>=2 в числителе,где синус было (a*sinx-n*b*cos bx) ,то есть не хватало в синусе буквы b
2)n=1, знак минус перед выражением
3)n=0, экспонента была в степени a*n , а не a*x
вроде как все.
прикреплю картинку с первоначальным видом.


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: Lapp 20.06.2010 16:21

Цитата(PUMA @ 20.06.2010 12:54) *
1)Там где n>=2 в числителе,где синус было (a*sinx-n*b*cos bx) ,то есть не хватало в синусе буквы b
2)n=1, знак минус перед выражением
3)n=0, экспонента была в степени a*n , а не a*x
вроде как все.
прикреплю картинку с первоначальным видом.
хм.. а откуда уверенность, что это опечатки? из общих соображений или есть эта формула в справочнике? Вообще, должна быть.. но я сейчас навскидку не нашел ((. Надо посерьезнее поискать.

Буква b под синусом - это да, похоже, что должна быть. А вот про минус я как-то сомневаюсь..

Ну как, разобралась с функцией?

Автор: PUMA 20.06.2010 16:35

из общих соображений 10.gif
да вроде все понятно))первое это степень считаем.ставим условие если она отрицательна.второе эт мы уже непосредственно считаем при разных значениях n. так?
cool.gif спасибо большое

Автор: Lapp 20.06.2010 16:50

Цитата(PUMA @ 20.06.2010 13:35) *
из общих соображений 10.gif


Цитата
да вроде все понятно))первое это степень считаем.ставим условие если она отрицательна.второе эт мы уже непосредственно считаем при разных значениях n. так?
функция для степени - чисто вспомогательная. В ней я немного лишнего наворотил.. в этой задаче n не может быть отрицательным, так что проверка и все, что внутри делается - это все лишнее, можно выбросить. Я сделал из любви к общности - понимаешь?

Основное, на что тебе тут надо обратить внимание - это как работает рекурсия. Еще раз посмотри и проследи логику, чтоб никаких вопросов не оставалось неотвеченных. Я жду твоего ответа.

Автор: Lapp 20.06.2010 17:15

Есть эта формула в http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D0%BB%D0%BE%D0%B2_%D0%BE%D1%82_%D1%8D%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9 ))
То есть, почти такая, там нету b. Но оно вроде легко туда вводится заменой типа x=by.. или нет? тяжко шевелить извилинами в такую позднь.. (

Автор: PUMA 20.06.2010 17:35

function IntPow(x: double; n: integer): double;
var
r: double;i:byte;
begin
r:=1;
for i:=1 to n do
r:=r*x;
IntPow:=r
end;
function IntEAXSINNBX(a,b,x: double; n: integer): double;
begin
case n of
0: IntEAXSINNBX:= Exp(a*x)/a;
1: IntEAXSINNBX:= Exp(a*x)*(a*Sin(b*x)-b*Cos(b*x))/(a*a+b*b);
else IntEAXSINNBX:=
(Exp(a*x)*IntPow(Sin(b*x),n-1)*(a*Sin(b*x)-n*b*Cos(b*x)) +
n*(n-1)*b*b*IntEAXSINNBX(a,b,x,n-2))/
(a*a+n*n*b*b)
end
end;
var a,b,n,x:integer;
begin
writeln('vvedite a i b');
readln(a,b);
writeln('vvedite stepen n i chislo x');
readln(n,x);
writeln( IntEAXSINNBX(a,b,x,n));
readln;
end.


вроде как решает

Автор: Lapp 20.06.2010 17:57

Цитата(PUMA @ 20.06.2010 14:35) *
вроде как решает

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

Очень просто:
- после begin (case, repeat, while) все сдвигаем право на 2 поз
- перед end (until) - влево на 2 поз
- между функциями оставляй строку (лучше две)
- разделы декларвций тоже двигаем

Вот, посмотри и старайся так делать
function IntPow(x: double; n: integer): double;
var
r: double;
i:byte;
begin
r:=1;
for i:=1 to n do r:=r*x;
IntPow:=r
end;


function IntEAXSINNBX(a,b,x: double; n: integer): double;
begin
case n of
0: IntEAXSINNBX:= Exp(a*x)/a;
1: IntEAXSINNBX:= Exp(a*x)*(a*Sin(b*x)-b*Cos(b*x))/(a*a+b*b);
else IntEAXSINNBX:=
(Exp(a*x)*IntPow(Sin(b*x),n-1)*(a*Sin(b*x)-n*b*Cos(b*x)) +
n*(n-1)*b*b*IntEAXSINNBX(a,b,x,n-2))/
(a*a+n*n*b*b)
end
end;


var
a,b,n,x: integer;

begin
writeln('vvedite a i b');
readln(a,b);
writeln('vvedite stepen n i chislo x');
readln(n,x);
writeln( IntEAXSINNBX(a,b,x,n));
readln;
end.

Только сейчас заметил, что ты переделала IntPow .. Ага, я ошибся.. забыл вычитать n. Нужно было вот так:
function IntPow(x: double; n: integer): double;
var
r: double;
begin
r:=1;
if n<0 then begin
n:=-n;
x:=1/x
end;
while n>0 do begin
r:=r*x;
Dec(n)
end;
IntPow:=r
end;

Молодец! )) Твоя функция, правда, не будет работать с отрицательными n, но оно тут и не нужно.

Автор: PUMA 20.06.2010 18:15

что то я не совсем поняла зачем вычитать при n>0
r:=r*x;
Dec(n)
blink.gif

Автор: Lapp 20.06.2010 18:21

Цитата(PUMA @ 20.06.2010 15:15) *

что то я не совсем поняла зачем вычитать при n>0
r:=r*x;
Dec(n)
blink.gif

Это не при n>0, а пока n>0. Это цикл. При каждом умножении r уменьшаем n на 1. Получается как бы счетчик. Когда n обнулится - выходим из цикла. Это как бы твой for, только наоборот, сверху вниз.

Автор: PUMA 20.06.2010 18:23

Цитата(Lapp @ 20.06.2010 14:21) *

Это не при n>0, а пока n>0. Это цикл. При каждом умножении r уменьшаем n на 1. Получается как бы счетчик. Когда n обнулится - выходим из цикла. Это как бы твой for, только наоборот, сверху вниз.

ага,всё поняла cool.gif