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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2011, 00:11   #1
Heles
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 21
По умолчанию Программа. Вычисление рекурретной последовательностью. Проблемы.

[Прошу помощи в нахождении ошибки.
Нужно вывести на экран таблицу значений функции y(x) и её разложения в ряд S(x) для x изменяющихся от Xn до Xk с заданным кол-вом шагов M(h=(Xk-Xn)/M.
Xn=0.2
Xk=1
e=0,001
Кол-во шагов - произвольно. В процессе программы с моим кодом программа не останавливается и сумма не совпадает со значениями функции. С математикой проблемы, поэтому в формулах что-то еще.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var a,xn,xk,h,e,s,y,x,m,n:extended;
begin
        Memo1.clear;
        Memo1.lines.add('Результаты выполнения программы:');
        xn:=StrToFloat(Edit1.Text);
        xk:=StrToFloat(Edit2.Text);
        M:=StrToFloat(Edit3.Text);
        e:=StrToFloat(Edit4.Text);
        x:=xn;
        h:=(xk-xn)/m;
        repeat
        a:=1; S:=1; n:=0;// При n=0 сумма S равна 1.
        While (abs(a) > e) do begin
        n:=n+1;
        a:=-a*(2*n*n+1)/(2*n*(2*n-1))*x*x;// По образцу посмотрел как формулу составить, так и не понял её.
        s:=s+a;
end;
        y:=(1-exp(2*ln(x))/2)*cos(x)-x/2*sin(x); // Сумма S должна совпадать с данной формулой.
        Memo1.Lines.Add('При X='+FloatToStrF(x,ffFixed,6,2)+'    Сумма='+FloatToStrF(s,ffFixed,8,4)+'  y='
                                                        +FloatToStrF(y,ffFixed,8,4)+'   N='
                                                        +FloatToStr(N));
        x:=xn+h;
        until x>xk
end;
end.
Изображения
Тип файла: jpg Безымянный.jpg (6.8 Кб, 142 просмотров)
Heles вне форума Ответить с цитированием
Старый 18.09.2011, 11:16   #2
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Код:
var a,xn,xk,h,e,s,y,x,m:extended;
    i,n:Byte;
    Fact:extended;
begin
        Memo1.clear;
        Memo1.lines.add('Результаты выполнения программы:');
        xn:=StrToFloat(Edit1.Text);
        xk:=StrToFloat(Edit2.Text);
        M:=StrToFloat(Edit3.Text);
        e:=StrToFloat(Edit4.Text);
        x:=xn;
        h:=(xk-xn)/m;
        repeat
        a:=1; S:=1; n:=0;// При n=0 сумма S равна 1.
        While (abs(a) > e) do begin
        n:=n+1;
        fact:=1;
        For i:=1 to 2*n do //вычисляем факториал
        Fact:=Fact*i;
        a:=Power(-1,n)*((2*Sqr(N)+1)/fact)*Power(x,2*n);
        s:=s+a;
end;
        y:=(1-(Sqr(x)/2))*cos(x)-((x/2)*sin(x)); // Сумма S должна совпадать с данной формулой.
        Memo1.Lines.Add('При X='+FloatToStrF(x,ffFixed,6,2)+'    Сумма='+FloatToStrF(s,ffFixed,8,4)+'  y='
                                                        +FloatToStrF(y,ffFixed,8,4)+'   N='
                                                        +FloatToStr(N));
        x:=x+h;
        until x>xk
end;
И не забудь подключить модуль Math для использования функции Power
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 18.09.2011, 13:21   #3
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Вывел рекурентное отношение для b[n]=-b[n-1]*x*x/(2*n*(2*n-1)), при этом a[n]=b[n]*(2*n*n+1)
Код:
procedure TForm1.Button1Click(Sender: TObject);
var b,a,xk,h,e,s,y,x,m,n:extended;
begin
        Memo1.clear;
        Memo1.lines.add('Результаты выполнения программы:');
        x:=StrToFloat(Edit1.Text);
        xk:=StrToFloat(Edit2.Text);
        M:=StrToFloat(Edit3.Text);
        e:=StrToFloat(Edit4.Text);
        h:=(xk-x)/m;
        repeat
         b:=1; a:=1; S:=1; n:=0;// При n=0 сумма S равна 1.
         While (abs(a) > e) do begin
            n:=n+1;
            b:=-b*x*x/(2*n*(2*n-1)); 
            a:=b*(2*n*n+1);
            s:=s+a;
          end;
         y:=(1-exp(2*ln(x))/2)*cos(x)-x/2*sin(x); // Сумма S должна совпадать с данной формулой.
         Memo1.Lines.Add('При X='+FloatToStrF(x,ffFixed,6,2)+'    Сумма='+FloatToStrF(s,ffFixed,8,4)+'  y='
              +FloatToStrF(y,ffFixed,8,4)+'   N=' +FloatToStr(N));
         x:=x+h;
        until x>xk
end;
end.
... а зацикливалась программа у вас потому что х увеличивался на h относительно первой точки, а не текущего значения
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 19.09.2011, 19:26   #4
Heles
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 21
По умолчанию

А вот тут в чем может быть ошибка? s(x) не совпадает с y(x). Где-то в формуле скорее всего ошибка, но перепроверял 10 раз.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var a,xk,h,e,s,y,x,m,n:extended;
begin
        Memo1.clear;
        Memo1.lines.add('Результат:');
        x:=StrToFloat(Edit1.Text);
        xk:=StrToFloat(Edit2.Text);
        M:=StrToFloat(Edit3.Text);
        e:=StrToFloat(Edit4.Text);
        h:=(xk-x)/m;
        repeat
        a:=1;  S:=0.005; n:=1;
        While (abs(a) > e) do begin
                n:=n+1;
                a:=(power(-a,n+1)*power(x,2*n))/((2*n)*(2*n-1));
                s:=s+a;
end;
         y:=(x*arctan(x))-(ln(sqrt(1+x*x)));
        Memo1.Lines.Add('При X='+FloatToStrF(x,ffFixed,6,1)+'    Сумма='+FloatToStrF(s,ffFixed,8,4)+'  y='
                                                       +FloatToStrF(y,ffFixed,8,4));
        x:=x+h;
        until x>xk
end;
end.
Изображения
Тип файла: jpg Безымянный1.jpg (6.0 Кб, 127 просмотров)
Heles вне форума Ответить с цитированием
Старый 19.09.2011, 19:59   #5
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

если вы хотите просто вычислять значение, то
Код:
a:=(power(-1,n+1)*power(x,2*n))/((2*n)*(2*n-1));
при помощи рекурентного соотношение
Код:
        b:=-1; S:=0; a:=b; n:=0;
        While (abs(a) > e) do
         begin
          n:=n+1;
          b:=-b*x*x;
          a:=b/(2*n*(2*n-1));
          s:=s+a;
         end;
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 19.09.2011, 20:24   #6
Heles
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 21
По умолчанию

Step_UA, спасибо)
Heles вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу с последовательностью Татьяна12678 Паскаль, Turbo Pascal, PascalABC.NET 1 22.05.2011 15:14
Программа на вычисление функции (Pascal) xRJ10 Помощь студентам 1 23.12.2009 17:57
Помогите с последовательностью ==Terman== Microsoft Office Excel 5 06.06.2009 12:37
Заполнить матрицу линейной последовательностью Настенька..Блонди Помощь студентам 5 05.02.2009 20:53
программа на вычисление скалярного произведения klopp Паскаль, Turbo Pascal, PascalABC.NET 3 05.12.2008 21:17