Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 28.11.2016
Сообщений: 67
1

Вычислить и вывести на экран в виде таблицы значения функции, заданной в виде ряда Тейлора

17.02.2017, 07:48. Просмотров 3255. Ответов 6
Метки нет (Все метки)


Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью
ряда Тейлора, на интервале от хнач до xкон с шагом dx с точностью ε. Таблицу снабдить
заголовком и шапкой. Каждая строка таблицы должна содержать значение аргумента,
значение функции и количество просуммированных членов ряда.

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\ln (x)=\sum_{n=0}^{\infty}\frac{(-1)^n(x-1)^{n+1}}{n+1}=(x-1)-\frac{(x-1)^2}{2}+\frac{(x-1)^3}{3}-...,\ \ \ 0<x\leq 2<br />

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.02.2017, 07:48
Ответы с готовыми решениями:

Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора
Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на...

Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора
Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на...

Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора
Помогите исправить программу Program P3; var xn,xk,dx,e:real; n:integer; function...

Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора
Сам бы все это дело сделал бы да не могу :) у меня комп слишком &quot;Старый&quot; Для &quot;Новейшего&quot; Turbo...

6
Модератор
8397 / 4151 / 2871
Регистрация: 17.08.2012
Сообщений: 13,231
17.02.2017, 20:34 2
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Для начала можно произвести замену n := n + 1, чтобы не возиться с прибавлением единицы. Получим

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\left. \ln (x)=\sum_{n=0}^{\infty}\frac{(-1)^n(x-1)^{n+1}}{n+1}=\right|_{n := n+1}=\sum_{n=1}^{\infty}\frac{(-1)^{n+1}(x-1)^n}{n}=\sum_{n=1}^{\infty}a_n<br />

Найдём рекуррентное соотношение для членов (преобразованного) ряда:

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
a_1=x-1;\ a_n=\frac{(-1)^{n+1}(x-1)^n}{n};\ a_{n-1}=\frac{(-1)^n(x-1)^{n-1}}{n-1};<br />

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\frac{a_n}{a_{n-1}}=\frac{\frac{(-1)^{n+1}(x-1)^n}{n}}{\frac{(-1)^n(x-1)^{n-1}}{n-1}}=\frac{(x-1)(1-n)}{n};\ a_n=\frac{(x-1)(1-n)a_{n-1}}{n}<br />

Конечно, можно было бы использовать очевидные рекуррентные соотношения отдельно для числителя и отдельно для знаменателя, но программа получается чуть длиннее.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
const st = '+-----------------+-----------------+------------+';
var xn, xk, x, dx, eps, a, s: double;
    n: longword;
begin
  write('Xn = ');
  readln(xn);
  repeat
    write('Xk > Xn;  Xk = ');
    readln(xk)
  until xk > xn;
  repeat
    write('dx > 0;  dx = ');
    readln(dx)
  until dx > 0;
  repeat
    write('eps > 0;  eps = ');
    readln(eps)
  until eps > 0;
  xk := xk + dx / 2;
  x := xn;
  writeln(st);
  writeln('|        x        |       ln(x)     |      n     |');
  writeln(st);
  while x < xk do
    begin
      write('| ', x:15, ' | ');
      if (0 >= x) or (x > 2)
        then writeln('      undefined |    unknown |')
        else begin
          n := 1;
          a := x - 1;
          s := a;
          while abs(a) > eps do
            begin
              inc(n);
              a := (1 - n) / n * (x - 1) * a;
              s := s + a
            end;
          writeln(s:15, ' | ', n:10, ' |')
        end;
      x := x + dx
    end;
  writeln(st);
  readln
end.
1
0 / 0 / 0
Регистрация: 28.11.2016
Сообщений: 67
01.03.2017, 12:40  [ТС] 3
А вот для этого уравнения?

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\ln x =2\sum_{n=0}^{\infty} \frac{(x-1)^{2n+1}}{(2n+1)(x+1)^{2n+1}}=2\left( \frac{x-1}{x+1}+\frac{(x-1)^3}{3(x+1)^3}+...\right),\ \ \ x>0<br />
0
Модератор
8397 / 4151 / 2871
Регистрация: 17.08.2012
Сообщений: 13,231
01.03.2017, 23:15 4
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Нет. В этом случае не совсем помогу, поскольку корректно данное задание не очень-то и выполнимо. Этот ряд практически неприменим для вычисления значения логарифма числа с заданной точностью с помощью компьютера. Посмотрим, почему это так.

Для простоты поделим всё на 2 и приступим...

https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{\ln x}{2}=\left. \sum_{n=0}^{\infty}\frac{\left(\frac{x-1}{x+1} \right)^{2n+1}}{2n+1}=\right|_{z=\frac{x-1}{x+1}}=\sum_{n=0}^{\infty}\frac{z^{2n+1}}{2n+1}=\sum_{n=0}^{\infty}a_n\ \ \ \ \ \begin{array}{l}x\,>\,0\\ 0\,<\,z\,<\,1\end{array}

Это знакопостоянный ряд, "обычный" критерий окончания вычислений (если модуль очередного члена ряда < ε) не подходит. Воспользуемся оценкой остатка ряда по интегральному признаку Коши-Маклорена для знакоположительного ряда:

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
r_n\ \leq \ \int_{k}^{\infty}f(n)\operatorname{d}n<br />

Вот тут-то и загвоздка.

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\int_{k}^{\infty}f(n)\operatorname{d}n=\int_{k}^{\infty}\frac{z^{2n+1}}{2n+1}\operatorname{d}n=\left. \frac{1}{2}\operatorname{Ei}\left((2n+1)\ln (z)\right)\right|_k^{\infty}<br />

Получается, что для того, чтобы корректно вычислить ln(x) с помощью ряда, нужно вычислить ln((x-1)/(x+1)). Мало того, в первообразной нагло торчит интегральная показательная функция, а это уже совсем труба. Обозначим для простоты аргумент Ei как t=(2n+1)ln(z). Ei - функция, не вычисляемая аналитически, но её можно вычислить, например, с помощью ряда Тейлора:

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\operatorname{Ei}(t)=\int_{-\infty}^{t}\frac{e^q}{q}\operatorname{d}q=\gamma +\ln |t|+\sum_{p=1}^{\infty}\frac{t^p}{p\cdot p!}<br />

где γ≈0.5772156649015328606065 - постоянная Эйлера, которую, если не задавать константой, тоже надо вычислять, например, как предел частичной разности гармонического ряда и логарифма (sic!) от количества членов ряда.

Аж смешно. Для того, чтобы правильно вычислить логарифм, нужно минимум два раза вычислить логарифм. Это напоминает действия Мюнхаузена по вытаскиванию себя вместе с лошадью из болота за собственные волосы.

Вообще говоря, я давно уже (некорректно) решил эту задачу, программа вот в этой теме: Циклы: вычислить значение суммы бесконечного ряда с заданной точностью, пост #3. Однако, сейчас я бы вычислил рекуррентное соотношение несколько по-другому:

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\sum_{n=0}^{\infty}\frac{z^{2n+1}}{2n+1}=\sum_{n=0}^{\infty}a_n<br />

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
a_0=z;\ \ \ a_n=\frac{z^{2n+1}}{2n+1};\ \ \ a_{n-1}=\frac{z^{2n-1}}{2n-1};<br />

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
k=\frac{a_n}{a_{n-1}}=\frac{\frac{z^{2n+1}}{2n+1}}{\frac{z^{2n-1}}{2n-1}}=\frac{z^2(2n-1)}{2n+1}=\frac{z^2(n-0.5)}{n+0.5};\ \ \ a_n=\frac{z^2a_{n-1}(n-0.5)}{n+0.5}<br />

Для Вашего случая в программе нужно заменить
Pascal
21
22
  writeln('    S = ', 2 * s);
  write  ('ln(x) = ', ln(x));
Далее. При ("большом") отклонении x от 1 в любую сторону точность вычислений ни в какое эпсилон не лезет из-за неверного критерия окончания вычислений (применён критерий для рядов, сходящихся по Лейбницу, а нужен критерий по интегральному признаку Коши-Маклорена). Кроме того, при малых ε из-за ограниченности разрядной сетки компьютера точность тоже страдает (начиная с некоторого номера, очередной член ряда становится меньше веса последнего значащего разряда суммы, при этом реальный остаток ряда существенно превосходит заданную точность). Короче, все беды из-за того, что этот ряд знакопостоянный.

Есть некоторый смысл вычислить сумму ряда с точностью до компьютерного эпсилон:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var n: integer;
    x, z, a, s, st: extended;
begin
  repeat
    write('x > 0;  x = ');
    readln(x)
  until x > 0;
  z := (x - 1) / (x + 1);
  a := z;
  s := a;
  n := 0;
  repeat
    st := s;
    inc(n);
    a := z * z * a * (n - 0.5) / (n + 0.5);
    s := s + a
  until abs(st - s) = 0;
  writeln('    S = ', 2 * s);
  write  ('ln(x) = ', ln(x));
  readln
end.
Такой вариант программы более-менее корректный, результат получается с приличной точностью (порядка 10-18) при 10-6<x<106, но, к примеру, уже при x=10-8 или x=108 точность получается где-то 10-5. Слишком малые и слишком большие числа вводить опять же не рекомендую: считает долго, поскольку в этом случае ряд сходится очень медленно, и вдобавок результат может быть неверным из-за целочисленного переполнения в переменной n.

Вот, как-то так... Думаю, что подобные задания сегодня попадаются из-за некомпетентности составителей задач. Я уверен на 99%, что составитель этой задачи наивно полагал, что вычисления следует прекратить, как только очередной член ряда станет меньше ε. Ну что тут поделаешь... Молодые, необстрелянные ребята, впервые взявшие в руки лопату... Не ведают, каким концом землю ковырять, а задачки уже составляют со святой верой в свою непогрешимость. Обидно мне как-то. Что-то неладное случилось с качеством знаний после постсоветской реформы образования.
2
0 / 0 / 0
Регистрация: 28.11.2016
Сообщений: 67
03.03.2017, 07:59  [ТС] 5
Cyborg Drone, а почему в первой формуле нельзя ввести значение больше 2х?
0
Модератор
62901 / 46931 / 32344
Регистрация: 18.05.2008
Сообщений: 113,721
03.03.2017, 08:36 6
Потому что при x>2 числитель дробей растет быстрее чем знаменатель и ряд не сойдется.
1
Модератор
8397 / 4151 / 2871
Регистрация: 17.08.2012
Сообщений: 13,231
16.11.2019, 14:47 7
Дополнение к моему ответу: даже если удастся для данного ряда найти верный критерий окончания вычислений, обычным способом вычислить сумму с заданной точностью не удастся. Так как ряд сходится очень медленно, то, чтобы не потерять точность, придётся вычислять сумму ряда "задом наперёд": начиная с последнего не отбрасываемого члена ряда, и оканчивая членом ряда с номером 0.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2019, 14:47

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора
Помогите, пожалуйста, с решением

Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора
Вычислить и вывести на экран в виде таблицы значения функции, заданной с по- мощью ряда Тейлора,...

Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора
Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на...

Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора
Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.