Форум «Всё о Паскале» _ Задачи _ Определенный интеграл
Автор: PUMA 19.06.2010 22:18
Для заданных границ интегрирования a и b вычислите значение определенного интеграла следующего вида (используя рекурсию) как применить рекурсию? помогите пожалуйста
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.
Правильно ли я вообще решила
Автор: Lapp 20.06.2010 5:39
Цитата(PUMA @ 19.06.2010 19:18)
значение определенного интеграла следующего вида (используя рекурсию)
ну и какого же вида? PUMA, ты забыла привести вид, или не смогла? Можно сделать картинкой, а можно просто от руки, типа так: [интеграл от a до b] scrt(sin (x2)) - верхние и нижние индексы есть в форме ввода, а остальное как сумеешь.
Цитата
как применить рекурсию?
Вообще, применение рекурсии для вычисления интеграла - абсолютная нелепость. Но если надо - покажем.. Я думаю, имеется в виду рекурсивно прибавлять очередной кусочек при суммировании. То есть заменить цикл до m на рекурсию. Это медленно, требует много памяти, некрасиво, но - если такая цель, то можно.. ))
Цитата
Правильно ли я вообще решила
Как это можно сказать, не зная, что требуется? )) Приведи условие - посмотрим. Но, вообще-то, уже и так видно, что есть, что исправлять. И, пока я разглядывал твои вычисления в попытках догадаться, что же это за функция была, у меня возникли большие сомнения в том, что это может быть правильно.. Например - почему у тебя в вычислениях функции присутствуют a и b? как это вообще возможно? функция не может зависеть от пределов интегрирования. Ты уверена, что, например, не интегрируешь первообразную? )) Давай, ждем вида функции.
Автор: PUMA 20.06.2010 14:37
удалила случайно формулу
Эскизы прикрепленных изображений
Автор: Lapp 20.06.2010 14:47
Цитата(PUMA @ 20.06.2010 11:37)
удалила случайно формулу
Что это??..
аа... ну, тогда ясно, где и зачем тут рекурсия...
Добавлено через 5 мин. Но я тебя должен окончательно разочаровать: нет, твое решение неправильное, и это точно уже ((.
Ты видишь, справа такой же интегральчик, как и слева? Вот отсюда и рекурсия.
Погоди - а ты уверена, что тебе нужен именно определенный интеграл?
Автор: PUMA 20.06.2010 14:56
ну в задании так написано...откуда тогда взялись a и b? вообще не очень понимаю как и что делать надо
Автор: Lapp 20.06.2010 15:06
Цитата
вообще не очень понимаю как и что делать надо
Немудрено, я, например, тоже с трудом въезжаю.. Хорошо, давай разбираться )).
Цитата(PUMA @ 20.06.2010 11:56)
ну в задании так написано...откуда тогда взялись a и b?
a и b - это просто параметры, входящие в функцию. И они, конечно, должны быть заданы, если в итоге требуется числовой ответ.
То, что тут написано - это уже готовая формула интеграла, причем НЕопределенного (только константа у них куда-то затерялась..) То есть численное интегрирование (всякие трапеции и Симпсоны) тут не требуется. Нужно только сделать прогу для расчета по этим формулам. Стало яснее? )) или продолжить?
P.S. если можно, приведи условие поточнее.
Автор: PUMA 20.06.2010 15:24
продолжить как куда рекурсию применить
в задании только написано:Для заданных границ интегрирования a и b вычислите значение определенного интеграла следующего вида (используя рекурсию) и дана эта огроменная формула..мало того она еще с опечатками была дана
Автор: Lapp 20.06.2010 15:41
Цитата(PUMA @ 20.06.2010 12:24)
продолжить как куда рекурсию применить
в задании только написано:Для заданных границ интегрирования a и b вычислите значение определенного интеграла следующего вида (используя рекурсию) и дана эта огроменная формула..мало того она еще с опечатками была дана
С какими опечатками? ты уверена?
Если 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
из общих соображений да вроде все понятно))первое это степень считаем.ставим условие если она отрицательна.второе эт мы уже непосредственно считаем при разных значениях n. так? спасибо большое
Автор: Lapp 20.06.2010 16:50
Цитата(PUMA @ 20.06.2010 13:35)
из общих соображений
Цитата
да вроде все понятно))первое это степень считаем.ставим условие если она отрицательна.второе эт мы уже непосредственно считаем при разных значениях 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)
Автор: Lapp 20.06.2010 18:21
Цитата(PUMA @ 20.06.2010 15:15)
что то я не совсем поняла зачем вычитать при n>0 r:=r*x; Dec(n)
Это не при 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, только наоборот, сверху вниз.