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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2017, 11:47   #1
Pashok_Novichok
Новичок
Джуниор
 
Регистрация: 02.06.2017
Сообщений: 1
По умолчанию [Pascal] Нужно протабулировать функцию, заданную в виде бесконечного ряда lnx = (x-1)/x + (x-1)^2/2x^2 + ... на интервале [2,3] с шагом 0.1 и результаты записать в файл.

Всем Добрый день!
Решил данную задачу, преподаватель говорит, что ответ должен совпадать с ln(x), но у меня не совпадает, не могу понять в чем проблема. Может кто исправит или хотя бы скажет в чем проблема и что нужно исправить?
Вот код :
Код:
program p1;
var
    a , b , h , x , y , s , t , rt , eps : real;
    i : integer;//использую для степени
    FOut : text;
begin
Assign(FOut , 'f:\exam\f1.txt');
rewrite(FOut);

  writeln('Enter A, B, H, EPS!');
  write('A = '); readln(a);// 2.0
  write('B = '); readln(b);// 3.0
  write('H = '); readln(h);// 0.1
  write('EPS = '); readln(eps);// 1e-6

x := a;
i := 0;
s := 0;

  while ( y < eps ) do
  begin
    repeat
        i := i + 1;
        t := exp(i * ln(x - 1));//считаем числитель
        rt := exp(i * ln(i * x));//считаем знаменатель
        y := ln(t / rt);//затем логарифм
        x := x + h;
        s := s + y;
        writeln('T = ',t : 6 : 4,'| RT = ',rt : 6 : 4,' | Y = ',y : 6 : 4,' | Log = ',ln(x));
        writeln(FOut , 'T = ',t : 6 : 4,'| RT = ',rt : 6 : 4,' | Y = ',y : 6 : 4,' | Log = ',ln(x));
  until x >= b
  end;
  
end.
Вот ответ :
Enter A, B, H, EPS!
A = 2.0
B = 3.0
H = 0.1
EPS = 1e-6
X = 2.1 T = 1.0000| RT = 2.0000 | Y = -0.6931 | Log = 0.741937344729377
X = 2.2 T = 1.2100| RT = 17.6400 | Y = -2.6795 | Log = 0.78845736036427
X = 2.3 T = 1.7280| RT = 287.4960 | Y = -5.1142 | Log = 0.832909122935104
X = 2.4 T = 2.8561| RT = 7163.9296 | Y = -7.8274 | Log = 0.8754687373539
X = 2.5 T = 5.3782| RT = 248832.0000 | Y = -10.7422 | Log = 0.916290731874155
X = 2.6 T = 11.3906| RT = 11390625.0000 | Y = -13.8155 | Log = 0.955511445027437
X = 2.7 T = 26.8435| RT = 661454104.7774 | Y = -17.0199 | Log = 0.993251773010284
X = 2.8 T = 69.7576| RT = 47383813383.2162 | Y = -20.3365 | Log = 1.02961941718116
X = 2.9 T = 198.3593| RT = 4098310578334.3000 | Y = -23.7515 | Log = 1.06471073699243
X = 3 T = 613.1066| RT = 420707233300200.0000 | Y = -27.2544 | Log = 1.09861228866811

Последний раз редактировалось Аватар; 02.06.2017 в 13:32.
Pashok_Novichok вне форума Ответить с цитированием
Старый 02.06.2017, 13:01   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
y := ln(t / rt)
а логарифм здесь с какого боку? Просто y := t / rt
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.06.2017, 13:52   #3
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Там целый набор, например
- знаменатель не так вычисляется
- точность не так вычисляется
- шаг менять надо после нахождения логарифма через сумму ряда
- выводить надо сумму ряда, а не промежуточное слагаемое
Код:
x := a;
//lnx = (x-1)/x + (x-1)^2/2x^2 + (x-1)^3/3x^3 +
repeat
  t := 1;
  rt := 1;
  s0:=maxint;
  s := 0;
  i := 0;
  while ( abs(s-s0) > eps ) do
  begin
    i := i + 1;
    t := exp(i * ln(x - 1));//считаем числитель
    rt := i * exp(i * ln(x));//считаем знаменатель
    y := t/(rt);
    s0 := s;
    s := s + y;
  end;
  writeln(x:2:0);
  writeln('T = ',t : 6 : 4,'| RT = ',i*rt : 6 : 4,' | ssssssss = ',s : 6 : 4,' | Log = ',ln(x):6:4);
  writeln(FOut , 'T = ',t : 6 : 4,'| RT = ',i*rt : 6 : 4,' | SSSSSSS = ',s : 6 : 4,' | Log = ',ln(x));
  x := x + h;
until x >= b;
readln;
end.
P.S. Ну и числитель и знаменатель можно вычислять рекурентно без логарифма, а то получается что для вычисления логарифма нужно вычислять логарифм.
eoln вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
мне нужно протабулировать функцию с двумя переменными и вывести в форме таблицы и записать в текстовый файл Касік Visual C++ 1 22.03.2017 21:36
Протабулировать функцию у(x), заданную в виде angNov Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 08.11.2016 01:36
протабулировать функцию y=ctg(x+1/2) y на промежутке [-0.5; 0.5] с шагом h = 0,1. tima58 Помощь студентам 4 20.03.2015 06:21
Составить график и протабулировать следущие функции на заданном интервале [a,b], с заданным шагом h Pro_overrseer Помощь студентам 1 05.11.2013 23:27
РГЗ: массивы в Паскале-протабулировать функцию на интервале Веселина Паскаль, Turbo Pascal, PascalABC.NET 0 18.05.2011 19:08