Найти cos(x) и sin(x) зная только угол, не используя таблиц

Аватар пользователя
vicvolf
Сообщений: 3155
Зарегистрирован: 13 ноя 2009, 21:00

Найти cos(x) и sin(x) зная только угол, не используя таблиц

Сообщение vicvolf » 13 фев 2012, 11:07

folk писал(а):Source of the post
Замечания по тексту программы на бейсике.
попробуйте записать ряд вынося за скобки каждый раз квадрат x пополам, и так далее, а в программе вычислять начиная с самой внутренней скобки. такой подход позволит избежать возведения в степень и увеличит точность вычислений. Правда нужно будет сразу определить сколько же членов вам надо просуммировать, но это можно понять по величине последнего члена.

Об этом было в сообщении 3. В программе должен быть условный переход, в зависимости от оценки последнего члена, на следующую иттерацию.
Последний раз редактировалось vicvolf 28 ноя 2019, 17:30, всего редактировалось 1 раз.
Причина: test

Rody
Сообщений: 14
Зарегистрирован: 27 ноя 2011, 21:00

Найти cos(x) и sin(x) зная только угол, не используя таблиц

Сообщение Rody » 16 фев 2012, 21:30

Всем большое спасибо за ответы.
Насчет бейсика - тот алгоритм, что я выложил, надо сказать, далеко не самый идеальный. И способ там используется кривой. Куда проще было взять за основу готовую формулу ряда, и сделать алгоритм по ней.
На примере функции arcsin:
Изображение

Код: Выбрать все

Function ArcSin(SinX As Double) As Double
Dim z As Double, n As Long
For n = 0 To 85
 z = z + (Fact(2 * n) / ((2 ^ (2 * n)) * (Fact(n) ^ 2)) * ((SinX ^ (2 * n + 1)) / (2 * n + 1)))
Next n
ArcSin = z
End Function

Как видно, алгоритм полностью повторяет формулу ряда arcsin, и алгебраическая сумма начинается с n=0, а заканчивается n=85. Правда единственный недостаток данного способа в том, что даже с точностью до n=85, при расчете угла более 50 градусов, точность потихоньку падает. Если при 55 градусах погрешность составляет ~0,00000000001, то при 90 градусах, погрешность уже около 4-х градусов, что, конечно же, очень значительно. В чем проблема, мне не ясно. К счастью, в бейсике есть ф-ция, которая с куда наибольшей точностью высчитывает arcsin: ArcSin = Atn(SinX / Sqr(-SinX * SinX + 1))
Последний раз редактировалось Rody 28 ноя 2019, 17:30, всего редактировалось 1 раз.
Причина: test

folk
Сообщений: 4177
Зарегистрирован: 11 сен 2009, 21:00

Найти cos(x) и sin(x) зная только угол, не используя таблиц

Сообщение folk » 16 фев 2012, 21:41

Поменяйте направление суммирования - начиная с последних членов, вам это ничего не будет стоить в вашей программе, какой получится результат по точности? По хорошему надо приводить к $$\pi/8$$ и тангенс вроде как быстрее сходится.
Последний раз редактировалось folk 28 ноя 2019, 17:30, всего редактировалось 1 раз.
Причина: test

Rody
Сообщений: 14
Зарегистрирован: 27 ноя 2011, 21:00

Найти cos(x) и sin(x) зная только угол, не используя таблиц

Сообщение Rody » 16 фев 2012, 21:52

folk писал(а):Source of the post
Поменяйте направление суммирования - начиная с последних членов, вам это ничего не будет стоить в вашей программе, какой получится результат по точности? По хорошему надо приводить к $$\pi/8$$ и тангенс вроде как быстрее сходится.

Код: Выбрать все

For n = 85 To 0 Step -1
 z = z + (Fact(2 * n) / ((2 ^ (2 * n)) * (Fact(n) ^ 2)) * ((SinX ^ (2 * n + 1)) / (2 * n + 1)))
Next n
ArcSin = z

Видимо так? Точность осталась точно такой же, как и была.
И скажите, пожалуйста, что значит привести к Pi/8 ?
Последний раз редактировалось Rody 28 ноя 2019, 17:30, всего редактировалось 1 раз.
Причина: test

folk
Сообщений: 4177
Зарегистрирован: 11 сен 2009, 21:00

Найти cos(x) и sin(x) зная только угол, не используя таблиц

Сообщение folk » 16 фев 2012, 22:47

Пардон а Fact(80) не переполняет Long?
Последний раз редактировалось folk 28 ноя 2019, 17:30, всего редактировалось 1 раз.
Причина: test

Rody
Сообщений: 14
Зарегистрирован: 27 ноя 2011, 21:00

Найти cos(x) и sin(x) зная только угол, не используя таблиц

Сообщение Rody » 17 фев 2012, 07:49

folk писал(а):Source of the post
Пардон а Fact(80) не переполняет Long?

Fact(), естественно, не Long.

Код: Выбрать все

Function Fact(x As Long) As Double
 Dim i As Long
 Fact = 1
 For i = 1 To x
 Fact = Fact * i
 Next i
End Function

Да и потом, если бы было переполнение, программа бы мне обязательно об этом сказала, ибо ошибки не пропускаются.
Может быть стоит на форуме кодеров vb спросить? Хотя есть у меня подозрения, что проблемы в первоначальном алгоритме из вики.
Последний раз редактировалось Rody 28 ноя 2019, 17:30, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
vicvolf
Сообщений: 3155
Зарегистрирован: 13 ноя 2009, 21:00

Найти cos(x) и sin(x) зная только угол, не используя таблиц

Сообщение vicvolf » 17 фев 2012, 09:47

Rody писал(а):Source of the post
folk писал(а):Source of the post
Пардон а Fact(80) не переполняет Long?

Fact(), естественно, не Long.

Код: Выбрать все

Function Fact(x As Long) As Double
 Dim i As Long
 Fact = 1
 For i = 1 To x
 Fact = Fact * i
 Next i
End Function

Да и потом, если бы было переполнение, программа бы мне обязательно об этом сказала, ибо ошибки не пропускаются.
Может быть стоит на форуме кодеров vb спросить? Хотя есть у меня подозрения, что проблемы в первоначальном алгоритме из вики.

Разговор идет о том, что у Вас здесь бесконечный цикл, поэтому будет переполение. Либо надо явно указать счетчик циклов, либо сделать выход из цикла по условию.
Я уже Вам писал выше, что надо сделать выход из цикла по условию с анализом точности по последнему отброшенному члену ряда, но Вы упорно это не делаете
Последний раз редактировалось vicvolf 28 ноя 2019, 17:30, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
kiv
Сообщений: 1012
Зарегистрирован: 02 дек 2011, 21:00

Найти cos(x) и sin(x) зная только угол, не используя таблиц

Сообщение kiv » 17 фев 2012, 11:30

Rody писал(а):Source of the post
Изображение

Код: Выбрать все

Function ArcSin(SinX As Double) As Double
Dim z As Double, n As Long
For n = 0 To 85
 z = z + (Fact(2 * n) / ((2 ^ (2 * n)) * (Fact(n) ^ 2)) * ((SinX ^ (2 * n + 1)) / (2 * n + 1)))
Next n
ArcSin = z
End Function



Неэффективно. Лучше запоминать последний член, и новый строить из него. Например, член с $$z^7$$ можно получить из члена с $$z^5$$, умножая на $$\frac{25}{42}z^2$$ - думаю, общую формулу вывести труда не составит.
Последний раз редактировалось kiv 28 ноя 2019, 17:30, всего редактировалось 1 раз.
Причина: test

Rody
Сообщений: 14
Зарегистрирован: 27 ноя 2011, 21:00

Найти cos(x) и sin(x) зная только угол, не используя таблиц

Сообщение Rody » 17 фев 2012, 15:27

vicvolf писал(а):Source of the post
Rody писал(а):Source of the post
folk писал(а):Source of the post
Пардон а Fact(80) не переполняет Long?

Fact(), естественно, не Long.

Код: Выбрать все

Function Fact(x As Long) As Double
 Dim i As Long
 Fact = 1
 For i = 1 To x
 Fact = Fact * i
 Next i
End Function

Да и потом, если бы было переполнение, программа бы мне обязательно об этом сказала, ибо ошибки не пропускаются.
Может быть стоит на форуме кодеров vb спросить? Хотя есть у меня подозрения, что проблемы в первоначальном алгоритме из вики.

Разговор идет о том, что у Вас здесь бесконечный цикл, поэтому будет переполение. Либо надо явно указать счетчик циклов, либо сделать выход из цикла по условию.
Я уже Вам писал выше, что надо сделать выход из цикла по условию с анализом точности по последнему отброшенному члену ряда, но Вы упорно это не делаете

Где Вы наблюдаете бесконечный цикл? Максимальный цикл, который будет при высчитывании факториала в моем примере - это 85.
Насчет анализа не очень понятно что Вы имеете в виду, поэтому и не делаю
kiv писал(а):Source of the post
Rody писал(а):Source of the post
Изображение

Код: Выбрать все

Function ArcSin(SinX As Double) As Double
Dim z As Double, n As Long
For n = 0 To 85
 z = z + (Fact(2 * n) / ((2 ^ (2 * n)) * (Fact(n) ^ 2)) * ((SinX ^ (2 * n + 1)) / (2 * n + 1)))
Next n
ArcSin = z
End Function



Неэффективно. Лучше запоминать последний член, и новый строить из него. Например, член с $$z^7$$ можно получить из члена с $$z^5$$, умножая на $$\frac{25}{42}z^2$$ - думаю, общую формулу вывести труда не составит.

Попробовал. То, что Вы написали работает. Только вот как я не пытался найти член z^9, зная член z^7, так ничего и не вышло. Вот если бы Вы написали еще как зная член z^7, найти член z^9, искать закономерность было бы куда проще, и общую формулу выводить, разумеется, тоже.
Последний раз редактировалось Rody 28 ноя 2019, 17:30, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

Найти cos(x) и sin(x) зная только угол, не используя таблиц

Сообщение NT » 17 фев 2012, 16:58

А я бы обратил внимание на то, что внутри цикла (in Function ArcSin ... For n = 0 To 85 {...})
каждое обращение к функции Fact(n) , по-существу считает факториал с самого начала.
Не это Fact(2 * n), а это Fact(n)^ 2.

Можно было бы задекларировать ее с 2-я аргументами,
в случе если подан только 1 аргумент, то выполнять в цикле(так как было),
если поданы оба аргумента, то результат выдавать как произведение 1-го аргумента на 2-й аргумент.

Код: Выбрать все

Типа такого :

Function Fact(x As Long, Optional y As Double = 0) As Double
 If y > 0 Then
 Fact = y * x
 Exit Function
 End If

 Dim i As Long
 Fact = 1
 For i = 1 To x
 Fact = Fact * i
 Next i
End Function

Последний раз редактировалось NT 28 ноя 2019, 17:30, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 10 гостей