Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 13.11.2020
Сообщений: 9

Не правильно находит синус по формуле Маклорена с минусовыми значениями икс

01.12.2020, 12:18. Показов 2476. Ответов 13

Студворк — интернет-сервис помощи студентам
Программа между числами a и b находит m иксов (между иксами одинаковое расстояние), а после для каждого икса подставляет y=sin(x), но сделанный вручную по формуле Маклорена (https://www.cyberforum.ru/cgi-bin/latex.cgi?sin(x)=x-\frac{{x}^{3}}{3!}+\frac{{x}^{5}}{5!}-\frac{{x}^{7}}{7!}+....,|x|<\infty), с точностью до 0.000000000000000001, а после выводится sin(x), который уже встроен в паскаль, для проверки правильности синуса икса по формуле Маклорена. Проблема в том, что при минусовых значениях икса идёт различие синуса по формуле и встроенного синуса (чем меньше икс, тем сильнее синусы различаются). Что нужно сделать, чтобы синус с минусовыми иксами по формуле Маклорена выводил правильные значения, т.е. был таким же как и встроенный синус? Надеюсь поможете. Для проверки можете подставить a=-1; b=-100; m=99
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
var
  a, b: real;                        {на лишние перемены внимание не обращайте}
  y, x: real;
  h, p: real;
  y1, y2, y3: real;               //y2 - сумма членов ряда по формуле Маклорена, т.е синус; y3 - встроенный синус
  d: real;                            // член ряда из формулы Маклорена
  m, i, n: integer;
 
begin
  p := 1;
  write('Введите a:');
  readln(a);
  write('Введите b:');
  readln(b);
  write('Введите m:');
  readln(m);
  h := (b - a) / m;
  for i := 0 to m do begin
    x := a + i * h;
    //sin
    d := x;
    y2 := d;
    n := 1;
    while abs(d) > 0.000000000000000001 do
    begin
      d := -d * sqr(x) / (2 * n * (2 * n + 1));   //из предыдущего члена ряда вывожу следующий
      y2 := y2 + d;
      n := n + 1
    end;
    y3 :=sin(x);
    write('x', i, '= ', x:3:5, '   ', 'y', i, '= ', y2, '     ', 'y', i, '= ', y3);
    writeln;
  end;
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.12.2020, 12:18
Ответы с готовыми решениями:

Не правильно находит синус
Задали написать программу, которая вычисляет синус, косинус, тангенс, котангенс. ...

Написать функцию, которая находит гиперболический синус и реализуется формуле
Написать функцию, которая находит гиперболический синус и реализуется формуле:

Как записать синус двух икс?
Как составить программу на С++. функций sin x, sin x2, sin2 x для двух значений аргумента.

13
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
01.12.2020, 12:38
стр. 23
Pascal
1
n := 0;
Добавлено через 1 минуту
И строку 28 переставить перед строкой 26.

Добавлено через 51 секунду
Ну и причесать программу, особенно вывод.
0
0 / 0 / 0
Регистрация: 13.11.2020
Сообщений: 9
01.12.2020, 12:51  [ТС]
Проблему это не решило

Добавлено через 4 минуты
И что значит причесать? Я просто только начал программировать. То есть я понимаю, что причесать, это сделать покрасивее, но не знаю - что. Мне кажется в выводе все норм
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
01.12.2020, 12:58
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
var a,b,h,x,y1,y2,y3,d:real;
    m,i,n:integer;
begin
repeat
writeln('Введите интервал a<b');
readln(a,b);
until a<b;
repeat
write('Введите количество разбиений m>1 m=');
readln(m);
until m>1;
h:=(b-a)/m;
for i:=0 to m do
 begin
  x:=a+i*h;
  //sin
  d:=x;
  y2:=d;
  n:=0;
  while abs(d)>0.0001 do
   begin
    n:=n+1;
    d:=-d*sqr(x)/(2 * n * (2 * n + 1));   //из предыдущего члена ряда вывожу следующий
    y2:=y2+d;
   end;
  y3:=sin(x);
  writeln('x',i:2,'=',x:6:2,' y',i:2,'=',y2:8:4,' y',i:2,'=',y3:8:4);
 end;
end.
Миниатюры
Не правильно находит синус по формуле Маклорена с минусовыми значениями икс  
0
0 / 0 / 0
Регистрация: 13.11.2020
Сообщений: 9
01.12.2020, 13:00  [ТС]
да блин, я же написал, что чем меньше икс, тем больше различия. Попробуйте a=-30 b=-70 m=29, к примеру. Там очень сильно различаться будет
0
0 / 0 / 0
Регистрация: 13.11.2020
Сообщений: 9
01.12.2020, 13:02  [ТС]
воть
Миниатюры
Не правильно находит синус по формуле Маклорена с минусовыми значениями икс  
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
01.12.2020, 13:09
Это от того что никому не приходило в голову считать sin(-70), обычно считают в интервале -2pi..2pi.

Добавлено через 1 минуту
И вообще
Ряд Маклорена – это частный случай ряда Тейлора в окрестности точки x=0.
0
0 / 0 / 0
Регистрация: 13.11.2020
Сообщений: 9
01.12.2020, 13:20  [ТС]
Да я был бы только рад, если бы так можно было. Но мне нужно написать эту программку по указанию преподавателя, и икс может быть от минус бесконечности до плюс бесконечности. Вообще я завтра смогу спросить и узнать, как исправить. Просто хотел с чистой душой сегодня закончить, но видимо не дано)
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
01.12.2020, 13:40
Лучший ответ Сообщение было отмечено Darkmun как решение

Решение

Напишите так.
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
var a,b,h,x,x1,y1,y2,y3,d:real;
    m,i,n:integer;
begin
repeat
writeln('Введите интервал a<b');
readln(a,b);
until a<b;
repeat
write('Введите количество разбиений m>1 m=');
readln(m);
until m>1;
h:=(b-a)/m;
for i:=0 to m do
 begin
  x:=a+i*h;
  x1:=x;
  if x1<-pi then while x1<-pi do} x1:=x1+pi
  else if x1>pi then while x1>pi do x1:=x1-pi;
  //sin
  d:=x1;
  y2:=d;
  n:=0;
  while abs(d)>0.0001 do
   begin
    n:=n+1;
    d:=-d*sqr(x1)/(2 * n * (2 * n + 1));   //из предыдущего члена ряда вывожу следующий
    y2:=y2+d;
   end;
  y3:=sin(x);
  writeln('x',i:2,'=',x:6:2,' y',i:2,'=',y2:8:4,' y',i:2,'=',y3:8:4);
 end;
end.
1
0 / 0 / 0
Регистрация: 13.11.2020
Сообщений: 9
01.12.2020, 13:48  [ТС]
Там знаки различаются, т.е. в вашем варианте синуса все значения выходят минусовые, в отличии от встроенного синуса
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
01.12.2020, 13:55
Это я задумался и не то написал. Замените везде pi на 2*pi
1
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
01.12.2020, 13:57
Лучший ответ Сообщение было отмечено Puporev как решение

Решение

Ну а привести x нельзя что-ли?
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
var
  a, b, x, sum, slog : Real;
  n, m, d : Integer;
begin
  Write('a b m : '); Read(a, b, m);
  for n := 0 to m do
  begin
    x := a + (b - a) / m * n;
    if (x < 2*pi) or (x > 2*pi) then
      x := x - Trunc(x / 2 / pi) * 2 * pi;
    
    d := 1;
    slog := x;
    sum := slog;
    repeat
      inc(d, 2);
      slog := -slog*x*x/d/(d-1);
      sum := sum + slog;
    until abs(slog) < 1e-8;
    
    WriteLn('sin(', a + (b - a) / m * n:7:4, ') = ', sin(a + (b - a) / m * n):7:4,
    '    sum = ', sum:7:4, '    отклонение = ', abs(sum-sin(a + (b - a) / m * n)):7:4);
  end;
end.
0
0 / 0 / 0
Регистрация: 13.11.2020
Сообщений: 9
01.12.2020, 13:59  [ТС]
Ляяя, спасибо огромное, чел, сильно помог. Рили. Немного жалко, что я не сам сделал, но все равно огромнейшее спасибо
0
Модератор
10445 / 5737 / 3406
Регистрация: 17.08.2012
Сообщений: 17,454
07.12.2020, 00:40
Darkmun, так, на всякий случай. Ошибка в расчётах возникает не при отрицательных значениях x, а при достаточно больших значениях |x|. Результат вычисления ни в какое эпсилон не лезет примерно при |x| > 40. Происходит так потому, что при достаточно большом |x| при увеличении n значение |x2n+1| поначалу растёт быстрее, чем (2n+1)!, и может создаться ситуация, когда очередной член ряда станет меньше веса младшего разряда мантиссы машинного представления суммы ряда, и остальные слагаемые на сумму ряда уже никак не повлияют.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.12.2020, 00:40
Помогаю со студенческими работами здесь

Разложения по формуле Маклорена
Добрый вечер! Помогите, пожалуйста, с решением некоторых задач!:cry: Требуется получить разложения по формуле Маклорена и записать их с...

Написать функцию, которая находит гиперболический синус
3)Структуризация программ. Функции: Написать функцию, которая находит гиперболический синус и реализуется формуле:y=sh(x)=(e^x-e^-x)/2.

Разложить функцию по формуле Маклорена
Здравствуйте. Дана функция. Разложить, порядок 2. f(x)=(1+x)^{x} Переписать исходную функцию можно в таком виде: (1+x)^{x} =...

Вычислить предел по формуле Тейлора-Маклорена
Вычислить предел, используя формулу Тейлора-Маклорена с остаточным членом в форме Пеано. x-&gt;0

Написать функцию, которая находит гиперболический синус и реализуется формулой
Написать функцию, которая находит гиперболический синус и реализуется формулой:


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru