Помощь - Поиск - Пользователи - Календарь
Полная версия: Определенный интеграл
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
PUMA
Для заданных границ интегрирования 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
Цитата(PUMA @ 19.06.2010 19:18) *
значение определенного интеграла следующего вида (используя рекурсию) mega_chok.gif
ну и какого же вида? blink.gif
PUMA, ты забыла привести вид, или не смогла? Можно сделать картинкой, а можно просто от руки, типа так:
[интеграл от a до b] scrt(sin (x2))
- верхние и нижние индексы есть в форме ввода, а остальное как сумеешь.

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

Цитата
Правильно ли я вообще решила blush.gif
Как это можно сказать, не зная, что требуется? ))
Приведи условие - посмотрим. Но, вообще-то, уже и так видно, что есть, что исправлять. И, пока я разглядывал твои вычисления в попытках догадаться, что же это за функция была, у меня возникли большие сомнения в том, что это может быть правильно.. Например - почему у тебя в вычислениях функции присутствуют a и b? как это вообще возможно? функция не может зависеть от пределов интегрирования. Ты уверена, что, например, не интегрируешь первообразную? ))
Давай, ждем вида функции.
PUMA
удалила случайно формулу 10.gif
Lapp
Цитата(PUMA @ 20.06.2010 11:37) *
удалила случайно формулу
Что это??.. blink.gif


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

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

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

Погоди - а ты уверена, что тебе нужен именно определенный интеграл?
PUMA
ну в задании так написано...откуда тогда взялись a и b?
вообще не очень понимаю как и что делать надо blush.gif
Lapp
Цитата
вообще не очень понимаю как и что делать надо blush.gif
Немудрено, я, например, тоже с трудом въезжаю.. Хорошо, давай разбираться )).

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

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

P.S.
если можно, приведи условие поточнее.
PUMA
продолжить blink.gif как куда рекурсию применить

в задании только написано:Для заданных границ интегрирования a и b вычислите значение определенного интеграла следующего вида (используя рекурсию) и дана эта огроменная формула..мало того она еще с опечатками была дана mad.gif
Lapp
Цитата(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
1)Там где n>=2 в числителе,где синус было (a*sinx-n*b*cos bx) ,то есть не хватало в синусе буквы b
2)n=1, знак минус перед выражением
3)n=0, экспонента была в степени a*n , а не a*x
вроде как все.
прикреплю картинку с первоначальным видом.
Lapp
Цитата(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
из общих соображений 10.gif
да вроде все понятно))первое это степень считаем.ставим условие если она отрицательна.второе эт мы уже непосредственно считаем при разных значениях n. так?
cool.gif спасибо большое
Lapp
Цитата(PUMA @ 20.06.2010 13:35) *
из общих соображений 10.gif


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

Основное, на что тебе тут надо обратить внимание - это как работает рекурсия. Еще раз посмотри и проследи логику, чтоб никаких вопросов не оставалось неотвеченных. Я жду твоего ответа.
Lapp
Есть эта формула в Википедии ))
То есть, почти такая, там нету b. Но оно вроде легко туда вводится заменой типа x=by.. или нет? тяжко шевелить извилинами в такую позднь.. (
PUMA
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
Цитата(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
что то я не совсем поняла зачем вычитать при n>0
r:=r*x;
Dec(n)
blink.gif
Lapp
Цитата(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
Цитата(Lapp @ 20.06.2010 14:21) *

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

ага,всё поняла cool.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.