Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2008, 16:33   #1
lantian
 
Регистрация: 27.05.2008
Сообщений: 4
По умолчанию Программирование алгоритмов циклическич структур

Доброго времени суток! Помогите разобраться с вычислением.
Задание:
Вычислить и вывести на экран в виде таблицы значения ф-ии, заданной с помощью ряда, на интервале от Хнач до Хкон с шагом dX и точностью E. Строка таблицы должна содержать аргумент, значение ф-ии и кол-во просуммированных членов ряда.
Si(x) = ∫(sin(x)/x)dx = x - (1/3!)*(x^3/3) + (1/5!)*(x^5/5) - ... |x|<∞
(интеграл с границами от 0 до x)

Надо в паскале =). Как реализовать программу самму знаю, а вот справится с этими мат вычислениями чет не могу, стыдно даж обращатся, бо в математике разбираюсь, а вот тут где на какой момент в цикле пихать вообще почему-то теряюсь всю жизнь . Помогите пожалуйста), заранее спасибо.
lantian вне форума Ответить с цитированием
Старый 21.10.2008, 20:55   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Разобрался в Вашей формуле, вот что получилось, объяснять не буду, что непонятно, спросите.
Код:
uses crt;
var x,xn,xk,dx,e,s,si,p:double;
    i:integer;
begin
clrscr;
write('xn=');readln(xn);
write('dx=');readln(dx);
xk:=xn+dx*15;
writeln('xk=',xk:0:2);
write('e=');readln(e);
x:=xn;
repeat
  s:=x;i:=1;p:=x*sqr(x)/(2*i*sqr((2*i+1)));
  while abs(s-si)>=e do
    begin
      s:=si;
      si:=si+p;
      p:=p*sqr(x)*(2*i-1)/(2*i*sqr((2*i+1)));
      inc(i);
    end;
  writeln('x=',x:5:2,'   si=',si:12:5,'   i=',i:3);
  x:=x+dx;
until x>xk;
readln
end.
puporev вне форума Ответить с цитированием
Старый 21.10.2008, 23:48   #3
lantian
 
Регистрация: 27.05.2008
Сообщений: 4
По умолчанию

Большое спасибо Вам!!!
Честно говоря не могу разобрать внутренний цикл while и приложить его к примеру...
вижу до него саму ф-ию.. и я так понимаю i играет роль числа 3, 5.. и каждый цикл наберает необходимое значение и умножается... или что тогда p:=p*sqr(x)*(2*i-1)/(2*i*sqr((2*i+1))) делает? и в каком месте меняется знак ?
lantian вне форума Ответить с цитированием
Старый 22.10.2008, 08:18   #4
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

во-первых формула
Цитата:
p:=p*sqr(x)*(2*i-1)/(2*i*sqr((2*i+1)))
неправильная
во-вторых
знак можно в цикле менять например так
Код:
if i mod 2 =0 then z:=-1 else z:=1;
p:=z*.....
и еще можно почитать теорию про ряды здесь
http://ru.wikipedia.org/wiki/Ряд_Тейлора
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 22.10.2008, 12:09   #5
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Формула написана так, как приведена в задании, про смену знаков, простите не углядел.
По формуле:
при i=1 p=x*x^2/(2*3)=x^3/3!
при i=2 p=p*(x^2*3)/(4*5*5)=x^5/(2*3*4*5)=x^5/5! и т.д. (в числителе добавили 3, чтобы убрать предыдущую тройку в знаменателе).
Будет время в течение дня программу переделаю, протестирую и выложу.
puporev вне форума Ответить с цитированием
Старый 22.10.2008, 14:13   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Вот исправил программу, проверил в Экселе, сходится.
Код:
uses crt;
var x,xn,xk,dx,e,s,si,p:double;
    i:integer;
begin
clrscr;
write('xn=');readln(xn);
write('dx=');readln(dx);
xk:=xn+dx*10;{здесь можно любое количество шагов}
writeln('xk=',xk:0:2);
write('e=');readln(e);
x:=xn;
repeat
  i:=1;p:=x*sqr(x)/(2*i*sqr((2*i+1)));s:=x-p;
{начальные значения для i=1 p=x^3/(2*3*3) s=x-p}
  while abs(s-si)>=e do
    begin
      si:=s; {запоминае значение s}
      inc(i);  {увеличиваем счетчик на 1}
      p:=p*(sqr(x)*(2*i-1)/(2*i*sqr((2*i+1))));{для i=2 p=x^5*3/(2*3*3*4**5*5)}
      if i mod 2=0 then  s:=s+p {если положительное i - прибавляем, отрицательное - вычитаем}
      else s:=s-p;
    end;
  writeln('x=',x:5:2,'   s=',s:12:8,'   i=',i:3);{выводим х, сумму, количество шагов}
  x:=x+dx; {следующее значение х}
until x>xk;
readln
end.
puporev вне форума Ответить с цитированием
Старый 22.10.2008, 16:05   #7
lantian
 
Регистрация: 27.05.2008
Сообщений: 4
По умолчанию

Огронейшее спасибо всем, сейчас сяду еще парочку решу, теперь самостоятельно и положу конец непониманию раз и навсегда! Спасибо!!!
lantian вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с задачей.(Пскаль).по теме программирование алгоритмов разветвляющейся структуры. svobodys Помощь студентам 6 12.10.2008 08:18
Программирование ветвящихся алгоритмов Дима82 Помощь студентам 4 11.05.2008 11:35
Программированние циклических алгоритмов Дима82 Помощь студентам 8 11.05.2008 11:31
diff для структур ag-moscow Общие вопросы C/C++ 2 09.04.2008 02:57
Российский конкурс алгоритмов Virtson Свободное общение 2 16.12.2007 21:53