Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Python + таблица Брадиса
Форум на CrossPlatform.RU > Разработка > Интерпретируемые языки
test_testovich
Привет.
Дали задание - найти угол в прямоугольном треугольнике, если известны катет и гипотенуза. По формуле sin(a)=AC/AB
Раскрывающийся текст
(_http://www.fxyz.ru/%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B_%D0%BF%D0%BE_%D0%B3%D0%B5%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D0%B8/%D0%BF%D0%BB%D0%BE%D1%81%D0%BA%D0%B8%D0%B5_%D1%84%D0%B8%D0%B3%D1%83%D1%80%D1%8B/%D1%82%D1%80%D0%B5%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA/%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D1%80%D0%B5%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%B0/ )


Получаем дробное значение и ищем его по таблице. Допустим, что гипотенуза 5, катеты 4 и 3. sin(A) = 3/5 = 0.6, а это примерно 60 градусов, хотя, может и ошибаюсь. Но вопрос не в этом. Вопрос в другом. Python'овские тригонометрические ф-ции требуют указания значения в радианах. Например, нам надо найти sin(90) градусов. Заведомо мы знаем, что ответом будет 1

A(рад) = 90 * (pi/180) = 1.57 - это равно pi/2, 0.999999682932 ~1
Цитата
print math.sin(90*(3.14/180))

Но это не те значения. Как мне получить значения угла именно из таблицы Брадиса, естественно, не вбивая эту таблицу в ассоциативный массив и т.п.

Благодарю за ответ.
ahalaj
Цитата(test_testovich @ 27.8.2014, 9:12) *
A(рад) = 90 * (pi/180) = 1.57 - это равно pi/2, 0.999999682932 ~1
Цитата
print math.sin(90*(3.14/180))

Но это не те значения. Как мне получить значения угла именно из таблицы Брадиса, естественно, не вбивая эту таблицу в ассоциативный массив и т.п.


#!/usr/bin/env python
import math

SINE_TABLE = [math.sin(math.radians(x)) for x in xrange(0, 90)]
COSINE_TABLE = [math.cos(math.radians(x)) for x in xrange(0, 90)]

def main():
    print("sine(5) = {0}".format(SINE_TABLE[5]))
    print("sine(15) = {0}".format(SINE_TABLE[15]))
    print("cosine(5) = {0}".format(COSINE_TABLE[5]))
    print("cosine(15) = {0}".format(COSINE_TABLE[15]))
if __name__ == '__main__':
    main()

[ahalaj@ahalaj foo]$ ./bradis.py
sine(5) = 0.0871557427477
sine(15) = 0.258819045103
cosine(5) = 0.996194698092
cosine(15) = 0.965925826289
[ahalaj@ahalaj foo]$


Принцип понятен? Таблицы синусов и косинусов строятся на лету, вбивать вручную это не надо. А после по индексу угла в градусах берёшь значение. Для углов больших 90 градусов выполняешь стандартное преобразование по четвертям из школьного курса тригонометрии. Вот и всё.
test_testovich
Несколько не то. Или вы вопрос не так поняли.
Попробую переделать задачу.

В прямоугольном треугольнике известны 3 стороны (+ разумеется угол 90 градусов). Найти угол А, если противолежащая сторона равна 3, а гипотенуза равна 5. Из описания синуса, как отношение противолежащей стороны к гипотенузе получаем 3/5 = 0.6

Вопрос sin(0.6) - это сколько градусов и как это вычислить программно, т.к. данные доступны только в таблице Брадиса. Создание словарей не предлагать.
ahalaj
Цитата(test_testovich @ 27.8.2014, 12:33) *
Несколько не то. Или вы вопрос не так поняли.
Попробую переделать задачу.

В прямоугольном треугольнике известны 3 стороны (+ разумеется угол 90 градусов). Найти угол А, если противолежащая сторона равна 3, а гипотенуза равна 5. Из описания синуса, как отношение противолежащей стороны к гипотенузе получаем 3/5 = 0.6

Вопрос sin(0.6) - это сколько градусов и как это вычислить программно, т.к. данные доступны только в таблице Брадиса. Создание словарей не предлагать.

#!/usr/bin/env python
import math

def main():
    print("angle: {0}".format(math.degrees(math.asin(3.0/5.0))))
    print("angle: {0}".format(math.asin(3.0/5.0) * 180 / math.pi))

if __name__ == '__main__':
    main()
[ahalaj@ahalaj foo]$ ./foo.py
angle: 36.8698976458
angle: 36.8698976458
[ahalaj@ahalaj foo]$


Как видим результат всегда одинаков (в градусах) как при использовании питоновской функции degrees из модуля math, так и при ручном переводе радианов в градусы. Или я опять не так понял? Или уважаемый test_testovich не знает про сущестование функции арксинус, арккосинус и подобных, обратных синусу, косинусу, etc.? :lol:

И да, это без таблиц, значение просто передаётся в функцию math.asin()
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.