0 / 0 / 0
Регистрация: 30.10.2016
Сообщений: 3

Задача на нахождение значения функции

22.11.2018, 08:51. Показов 2912. Ответов 5

Author24 — интернет-сервис помощи студентам
Надо написать программу которая находит значение функции e-x2 через ряд Тейлора, она работает от -4 до 4, хотя должна от минус бесконечности до положительной. Помогите, братцы(
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
var
  n, k, e: integer;
  x, y, y1, xmin, xmax, d, p, t: real;
 
begin
  write('Введите xmin и xmax: ');//диапазон иксов
  readln(xmin, xmax);
  write('Введите Е и N: ');//Е-знак после запятой(обратный эпсилон), N-колличество точек 
  readln(e, n);
  p := power(10, -e);//точность вычислений
  writeln(p);
  d := abs(xmax - xmin) / (n - 1);//интервал меду точками
  writeln('Шаг X: ', d);
  
  x := xmin;
  writeln('_______________________________________________');
  writeln('X  |Y ', ' ' * e, '|Колво членов ряда|y1', ' ' * e, '|');
  writeln('_______________________________________________');
  for var i := 1 to n do //для каждой точки Х вычисляем значения, 
  begin
    y1 := exp(-(x * x));//встроенная в паскаль функция экспоненты
    k := 0; {нулевой индекс}
    y := 1; {начальное значение итоговой суммы}
    t := 1;{знчение члена ряда при k=0}
    while abs(t) >= (p) do {пока модуль очердного члена ряда не меньше точности}  //нахождение значения функции при помощи степенного ряда
    begin
      k := k + 1;{следующий член}
      t := -t * x * x / k;{домножаем на х^2(возводим в степень) и делим на индекс(обратный факториал)}
      y := y + t;{суммируем}
    end;
    writeln();
    
    writeln(x:3, ' ', y:e + 2:e, ' ', k + 1:2, '                ', y1:e + 2:e);//выводим значение х, найденной функции, количества слагаемых в ряду Тейлора(t) и значение функции встроенной в паскаль для проверки 
    x := x + d;//следующая точка
  end;
end.
Вычислить таблицу значений функции f(x) на интервале от xmin до xmax в n равноотстоящих точках. Функция задана с помощью степенного ряда:

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
e^{-x^2}=\sum_{n=0}^{\infty}\frac{(-1)^nx^{2n}}{n!}=1-x^2+\frac{x^4}{2!}-\frac{x^6}{3!}+\frac{x^8}{4!}-...,\ \ \ |x|<\infty<br />

Значение функции в заданной точке найти с заданной точностью εps.

Для проверки правильности вычисления вывести на экран очередное значение xi, приближённое значение f(xi), количество просуммированных членов ряда, и значение функции, вычисленное с помощью стандартных функций Pascal.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.11.2018, 08:51
Ответы с готовыми решениями:

Нахождение значения функции с использованием процедуры или функции
Найти значение функции у, использовать не менее 1й подпрограммы функции или подпрограммы процедуры. Дано массив А, B,C-заданы,...

Процедура.Нахождение значения функции
Найти значение функции Z = x1+ex2, где x1, x2 - корни уравнения Aix2+Bix+Ci = 0, i = 1,2,..,N. Коэффициенты уравнения заданы в массивах A ,...

Нахождение наибольшего и наименьшего значения функции.
Найти наибольшее и наименьшее значения функции в заданном интервале с заданным шагом:

5
Почетный модератор
 Аватар для Puporev
64308 / 47605 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
22.11.2018, 10:28
Все у Вас считает, просто для |x|>4 нужно выводить значительно больше знаков после запятой, например
при х=8 e-x^2=1.6-28
поэтому не берите большие х.
0
0 / 0 / 0
Регистрация: 30.10.2016
Сообщений: 3
22.11.2018, 10:31  [ТС]
При вводе данных ниже значения совпадают до Х=4, после четырех начинают возрастать по модулю и беспорядочно менять знак, помощь нужна в этом плане


Введите xmin и xmax: 0
10
Введите Е и N: 28
11
1E-28
Шаг X: 1
________________________________________ _______
X |Y |Колво членов ряда|y1 |
________________________________________ _______

0 1.0000000000000000000000000000 2 1.0000000000000000000000000000

1 0.3678794411714420000000000000 28 0.3678794411714420000000000000

2 0.0183156388887345000000000000 46 0.0183156388887342000000000000

3 0.0001234098040126630000000000 65 0.0001234098040866800000000000

4 0.0000001125418050887180000000 89 0.0000001125351747192590000000

5 0.0000010525762268556400000000 117 0.0000000000138879438649640000

6 0.0510930537181251000000000000 149 0.0000000000000002319522830244

7 31468.1810700761000000000000000000 187 0.0000000000000000000005242886

8 -14196376812.1849000000000000000000000000 229 0.0000000000000000000000000002

9 548057726238561000.000000000000000000000 0000000 276 0.0000000000000000000000000000

10 -262204545007441000000000000.000000000000 0000000000000000 329 0.0000000000000000000000000000
0
Модератор
10147 / 5484 / 3370
Регистрация: 17.08.2012
Сообщений: 16,777
22.11.2018, 23:40
Лучший ответ Сообщение было отмечено Alej4ndro как решение

Решение

С чего Вы взяли, что железяка под названием "компьютер" может посчитать всё, что угодно, прямо до любой бесконечности? Учите матчасть.

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

Объяснение: в машинном представлении для типов real и double для мантиссы числа отводится 52 двоичных разряда, что примерно эквивалентно 15, ну, с натяжкой, 16 (значащим) десятичным разрядам, что прекрасно видно, кстати, по протоколу работы Вашей программы. Для x > 1 при увеличении n значение x2n поначалу растёт быстрее, чем n!, поэтому возникает ситуация, когда сумма "y" будет настолько большая, что очередное слагаемое "t" будет менее веса младшего значащего разряда мантиссы "y", и все оставшиеся "t" не повлияют на сумму "y".

Экстенсивные методы решения проблемы:

сменить тип real на extended, тогда будет около 20 десятичных значащих разрядов в мантиссе числа:
Pascal
3
  x, y, y1, xmin, xmax, d, p, t: extended;
и немножко увеличить устойчивость программы к анипереполнению (уменьшить ошибки усечения путём изменения порядка операций)
Pascal
28
      t := -t / k * x * x;{домножаем на х^2(возводим в степень) и делим на индекс(обратный факториал)}
но большого выигрыша это не даст.

Можно ещё применить длинную арифметику для чисел с плавающей точкой, но вряд ли стоит браться за сиё неблагодарное занятие.

Правильный метод решения этой проблемы: применить тождество e-x2=e[-x2]e{-x2}, где квадратные [] и фигурные {} скобки означают целую и дробную часть для -x2 соответственно. Тогда e[-x2] можно вычислить с помощью цикла for, поскольку [-x2] - целое, а e{-x2} - с помощью ряда Тейлора, и антипереполнения не возникнет, так как |{-x2}| < 1.

Добавлено через 14 минут
Можно ещё мой пост вот в этой теме: Вычислить e^x с заданной точностью по разложению в ряд почитать.

Добавлено через 1 минуту

Не по теме:

Фотографии текста запрещены. Ещё раз выложите фотографию текста - прокляну.

1
0 / 0 / 0
Регистрация: 30.10.2016
Сообщений: 3
23.11.2018, 02:49  [ТС]
Большое спасибо. У меня были подозрения, что числа получаются больше предусмотренного типом данных, но я думал Паскаль скажет мне об этом. Был бы признателен за чуть более подробное объяснение правильного решения.
Ошибки в теме учту ��
0
Модератор
10147 / 5484 / 3370
Регистрация: 17.08.2012
Сообщений: 16,777
24.11.2018, 23:23
Лучший ответ Сообщение было отмечено Alej4ndro как решение

Решение

Например, пусть x = 20.5. Тогда -x2 = -420.25. Нужно вычислить е-420.25. Представляем это в виде

e-420.25 = e(-420)+(-0.25) = e-420e-0.25.

Теперь пусть k = -420, q = e-420 = ek, d = e-0.25. Вычисляем q, например, следующим образом:
Pascal
1
2
3
4
5
6
7
8
9
const
  e = exp(1); //e = 2.718281828459045...
//<...>
  q := 1;
  if k < 0
    then a := 1 / e
    else a := e;
  for var i := 1 to abs(k) do q *= a;
//<...>
Далее вычисляем с нужной точностью d = e-0.25, применяя ряд Тейлора для ex (не для e-2x, смотрите, не перепутайте), и перемножаем q и d.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2018, 23:23
Помогаю со студенческими работами здесь

Нахождение значения функции с использованием рекурсии
Вот сама суть задачи: Найдите значение функции для любых целых неотрицательных аргументов. F(m,n) = { F(0,n) = n+1, { F(m,0)...

Нахождение наибольшего и наименьшего значения функции
Пожалуйста помогите решить задачу. Написать программу нахождения наибольшего и наименьшего значения функции y=3x*x+x-4 на интервале ,...

Вычислить значения функции. Правильно ли решена задача?
Не знаю как записать Ln^2 (x). Правильно ли я сделала? program Zadacha2; var x, t: real; const b=5; x1=-3; x2=0; begin ...

Задача с While. Вычислить значения функции на заданном промежутке
Значит нужно решить задачку с вайлом...шаг (h:=0,1), а:=-2, b:=2, х:=а... Вроде бы все. Заранее Спасибо!!!

Задача на нахождение значения функции
Исправьте пожалуйста ошибки в программе. Нужно объяснение использования логической операции И на примере. Можно ли решить задачу через...


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

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

Новые блоги и статьи
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
Колмогоровская сложность: Приёмы упрощения кода
ArchitectMsa 20.03.2025
Наверное, каждый программист хотя бы раз сталкивался с кодом, который напоминает запутанный лабиринт — чем дальше в него погружаешься, тем сложнее найти выход. И когда мы говорим о сложности кода, мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru