Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

Ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.
Ограничения: максимум вложений в сообщении — 3 (3 осталось), максимальный размер всех файлов — 300 КБ, максимальный размер одного файла — 100 КБ
Снимите пометку с вложений, которые необходимо удалить
Перетащите файлы сюда или используйте кнопку для добавления файлов
Вложения и другие параметры
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр

Сообщения в этой теме

Автор RawonaM
 - ноября 5, 2012, 18:11
Цитата: GaLL от ноября  5, 2012, 16:27
Это выводятся только те случаи, когда два варианта вычислений сильно расходятся?
Да они везде сильно расходятся, это только отрывок вывода.

Цитата: GaLL от ноября  5, 2012, 17:18
Если требуется вычисление расстояния между всеми парами точек, то выгоднее сначала перевести координаты в декартовы, а потом уже считать все пары расстояний. Если каждая точка встречается в запросах на расстояние в среднем раз 10 и более, то, очевидно, тоже (если конечно они уже все известны заранее).
Ну видимо поэтому они так и сделали, наверное.

Автор GaLL
 - ноября 5, 2012, 17:18
А вообще, вычисление синуса и косинуса раньше было гораздо медленнее, чем сложение и умножение вещественных типов данных. Так что здесь ещё надо разбираться, насколько замедляет вычисление расстояния переход к декартовым координатам.
Если требуется вычисление расстояния между всеми парами точек, то выгоднее сначала перевести координаты в декартовы, а потом уже считать все пары расстояний. Если каждая точка встречается в запросах на расстояние в среднем раз 10 и более, то, очевидно, тоже (если конечно они уже все известны заранее).

Кстати, если эти расстояния нужны в программе только для их сравнения друг с другом (т. е. определять, что ближе, что дальше), то можно вместо них использовать евклидовы. :)
Автор GaLL
 - ноября 5, 2012, 16:27
Это выводятся только те случаи, когда два варианта вычислений сильно расходятся?
Можно попробовать заменить float'ы на double'ы. Или добавить
if (fabs(pra - qra) < eps && fabs(pdec - qdec) < eps)
  { вычислить расстояние через декартовы координаты }
что не отразится значительно на времени работы, если точки лишь изредка расположены близко.
Автор RawonaM
 - ноября 5, 2012, 15:59
Цитата: GaLL от ноября  5, 2012, 14:08
Надо z = cosf(theta);
Действительно, спасибо. Я не перепроверял их алгоритм, а стоило.

Но результат теперь выходит странный:

Цитироватьtheta: 1.000000, mytheta: 0.989693
theta: 0.999999, mytheta: 0.633222
theta: 0.999999, mytheta: 0.428785
theta: 0.999999, mytheta: 0.945083
theta: 0.999998, mytheta: 0.884490
theta: 0.999999, mytheta: 0.586955
theta: 0.999999, mytheta: 0.530499
theta: 0.999999, mytheta: 0.919175
theta: 0.999998, mytheta: 0.857468
theta: 1.000000, mytheta: 0.439090
theta: 1.000000, mytheta: 0.408172
theta: 1.000000, mytheta: 0.270013
theta: 1.000000, mytheta: 0.163122
theta: 1.000000, mytheta: 0.054385
theta: 1.000000, mytheta: 0.987898
Автор GaLL
 - ноября 5, 2012, 14:34
Цитата: Квас от июля 22, 2011, 13:45
Цитата: RawonaM от июля 22, 2011, 13:35
Цитата: Квас от июля 22, 2011, 13:29В обосновании надо быть аккуратным, потому что ряды с общим членом, эквивалентным 1/n, расходятся. Как указано в вики, железобетонно будет через предел.
Так я через предел и нашел. А как еще?

Да мало ли? :donno: Например,
[tex]<br />\sum_{k=1}^{\infty}\frac{1}{(k+1)(k+2)}=\sum_{k=1}^{\infty}\left(\frac{1}{k+1}-\frac{1}{k+2}\right)=\\=\left(\frac{1}{2}-\frac{1}{3}\right)+\left(\frac{1}{3}-\frac{1}{4}\right)+\left(\frac{1}{4}-\frac{1}{5}\right)+\ldots=\\<br />=\frac{1}{2}+\left(-\frac{1}{3}+\frac{1}{3}\right)+\left(-\frac{1}{4}+\frac{1}{4}\right)+\ldots=\frac{1}{2}<br />[/tex]

Кстати, разложение на элементарные дроби работает и вообще для [tex]\sum_{k=1}^{\infty}\frac{1}{P(x)}, [/tex] где P(x) - многочлен k-ой степени с k различными действительными корнями. Это нетрудно показать при помощи алгоритма разложения на элементарные дроби.

Цитировать
Это решение не годится без серьёзных пояснений, потому что производится перегруппировка членов условно сходящегося ряда.
Достаточно записать в таком виде i-ую частичную сумму, там получится
[tex]<br />\frac{1}{2}-\frac{1}{i+2}<br />[/tex]
стремящееся к 1/2.
Автор GaLL
 - ноября 5, 2012, 14:08
Цитата: RawonaM от ноября  5, 2012, 12:15
phi   = ra * dpi/180.0;
theta = (90.0-dec)*dpi/180;
x = sinf(theta)*cosf(phi);
y = sinf(theta)*sinf(phi);
z = sinf(cosf(theta));
Надо z = cosf(theta);

Автор RawonaM
 - ноября 5, 2012, 13:47
Цитата: GaLL от ноября  5, 2012, 13:38
Раз от полюса, то должно быть:
sinf(pra)*sinf(qra)*cosf(pdec-qdec)+cosf(pra)*cosf(qra)
Поменял, вот результат:

Цитироватьtheta: 0.999560, mytheta: 0.989693
theta: 0.999563, mytheta: 0.633222
theta: 0.999563, mytheta: 0.428785
theta: 0.999564, mytheta: 0.945083
theta: 0.999563, mytheta: 0.884490
theta: 0.999563, mytheta: 0.586955
theta: 0.999563, mytheta: 0.530499
theta: 0.999564, mytheta: 0.919175
theta: 0.999563, mytheta: 0.857468
theta: 0.999567, mytheta: 0.439090
theta: 0.999569, mytheta: 0.408172
theta: 0.999569, mytheta: 0.270013
theta: 0.999568, mytheta: 0.163122
theta: 0.999568, mytheta: 0.054385
theta: 0.999569, mytheta: 0.987898
Автор GaLL
 - ноября 5, 2012, 13:38
Раз от полюса, то должно быть:
sinf(pra)*sinf(qra)*cosf(pdec-qdec)+cosf(pra)*cosf(qra)
Автор RawonaM
 - ноября 5, 2012, 13:35
Цитата: GaLL от ноября  5, 2012, 13:31
Цитата: RawonaM от ноября  5, 2012, 12:15printf("theta: %f, mytheta: %f\n", theta, cosf(pra)*cosf(qra)*cosf(pdec-qdec)+sinf(pra)*sinf(qra));
pra и qra отсчитываются от полюса или от экватора?
От полюса, они тут вычисляются:

      phi   = ra * dpi/180.0;
      theta = (90.0-dec)*dpi/180;
      x[i] = sinf(theta)*cosf(phi);
      y[i] = sinf(theta)*sinf(phi);
      z[i] = sinf(cosf(theta));
      raa[i] = phi;
      deca[i] = theta;


Тут запутано с названиями переменных, по-хорошему надо было по-другому называть, прошу прощения :)
Автор GaLL
 - ноября 5, 2012, 13:31
Цитата: RawonaM от ноября  5, 2012, 12:15
printf("theta: %f, mytheta: %f\n", theta, cosf(pra)*cosf(qra)*cosf(pdec-qdec)+sinf(pra)*sinf(qra));
pra и qra отсчитываются от полюса или от экватора?