| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Программирование, связанное с MS Office > Увеличение точности вычислений |
| Автор: A32 14.3.2018, 00:10 |
| Не хватает 15 значащих цифр переменной Double. Считаю в макросе орбиту Сатурна - первый з-н Кеплера не выполняется. Не сильно - но до трёх последних значащих цифр доходит. Если считать орбиту спутника Земли - ошибка меньше, но есть - одна цифра. В макросе много операций умножения и ошибка нарастает. В калькуляторе Windows значащих цифр 32, мне подходит. Можно ли из VBA обратиться к калькулятору или есть другой способ? |
| Автор: Akina 14.3.2018, 08:23 |
Можно. Но при большом количестве операций замаешься ждать результата. Используй внешние библиотеки длинной арифметики (скажем, LongNum http://www.cyberforum.ru/vba/thread1780318.html#post9432563 или там BigRational https://archive.codeplex.com/?p=bcl), или BigInteger из .Net. |
| Автор: Romikgy 14.3.2018, 09:39 |
| может алгоритм подкрутить ? можно на него взглянуть ? |
| Автор: A32 15.3.2018, 00:58 | ||
Там нечего подкручивать, он простой, как пять копеек. Задаются начальные координаты и начальные скорости, интервал времени dt. Считается сила, действующая на спутник и новые координаты через время dt. Для взглянуть файл прилагается, но без расчётов, т.к. с расчётами он весит 1,5 М и я не хочу грузить сервер форума ненужными данными. Там один макрос - он всё и считает, там всё закомментировано. Расчётов задано 10 тыс., это примерно один оборот спутника при заданных условиях. Кеплеровские площади на Листе2 (там есть 10 расчётов для примера, но всё норм - ошибка появляется где-то после 1000 расчётов), исходные данные на Листе1. Неприятность в том и заключается, что каждый расчёт содержит ошибку, а следующий расчёт исходит из предыдущего и ошибка накапливается. А сервер не дал мне загрузить файл exel. Загрузил текстовой с макросом. |
| Автор: A32 15.3.2018, 01:14 | ||
Посмотрел и не понял, надо разбираться. Правильно я понял, что длинное число сохраняется As Object ? |
| Автор: Romikgy 15.3.2018, 09:47 | ||||
| A32, это Sub TR6() вызывается 1000 раз?
эти данные можно увидеть ? и как узнать какие должны быть цифры после 1000 расчетов? что архиваторами не? религия не позволяет? Добавлено через 11 минут и 58 секунд попробуйте заменить его на тип
|
| Автор: A32 15.3.2018, 10:49 | ||||||
Они должны быть одинаковыми
Туплю иногда
Запускается один раз вручную RUNом |
| Автор: Romikgy 15.3.2018, 11:41 |
| у меня всегда цифры одни и теже на что смотреть? Добавлено через 2 минуты и 26 секунд или имеется ввиду что на лист 2 5 строка -2,860560000000E+10 а 10000 -2,860560000006E+10 это имелось ввиду? |
| Автор: A32 15.3.2018, 11:51 | ||
| Да ну, как это? Уже в 87 строке последние значащие цифры ...9,9988 (Лист2, первый столбец), а дальше есть гораздо больше. Ошибка не нарастает монотонно, а гуляет вокруг среднего значения. Вот я и хочу понять - что это: ошибка вычисления или метода? Добавлено @ 11:52
Да, конечно. Но это ..0,0565 и вопрос в принципе - где косяк? |
| Автор: Romikgy 15.3.2018, 12:02 | ||
| что это за формула DS1 = (Y11 * (X11 - X10) - X11 * (Y11 - Y10)) / 2 ? что она выражает? по какой причине у вас кусочные данные по х перемножаются с кусочными данными по у ?? Добавлено через 5 минут и 46 секунд
отсюда выводится DS1 = (Y11 * (VX1 * DT) - X11 * (VY1 * DT)) / 2 для какой цели перемножается скорость по оси х со смещением по у ??? |
| Автор: Romikgy 15.3.2018, 16:07 |
| Я так понимаю, это аналог симуляции , выстрела 1 кг телом с полюса для вывода его на орбиту.... так вот радиус ваш с каждой итерацией уменьшается... соотв. увеличивается гравитация , что видно из листа 5 Вы через землю стреляете? |
| Автор: A32 15.3.2018, 23:38 | ||
Макрос считает орбиту тела (координаты), начиная с заданных, это лист4. Проверкой корректности расчёта является соответствие результатов второму закону Кеплера. DS1 - это площадь треугольника с вершинами в (0,0),(X10,Y10),(X11,Y11), X11 и Y11 считаются так, будто бы на тело НЕ действует центральная сила, второй расчёт DS1 (надо было бы обозвать его DS2) считается с учётом действия центральной силы. Эти площади должны быть равны между собой и равны рассчитанным на предыдущем шаге. И на следующем шаге то же должны быть равны. Любое отклонение является признаком ошибки расчёта. Если бы я стрелял с полюса в Луну - я бы удовлетворился такой точностью. Но у меня другая мысль, которую я хотел бы проверить расчётом. Ещё не проверил, застрял здесь, но, допустим, расчёты её (мысль) подтвердят и я на форуме астрономов говорю (к примеру): "Устройство нашей планетной системы описано неправильно, вот расчёты". Что я услышу в ответ? - А32, ты с начала разберись со своими расчётами - у тебя законы Кеплера не соблюдаются. То, что радиус уменьшается - это нормально, Земля в расчётах предполагается точечной массой и встреча тела с поверхностью не предусмотрена. И начальные скорости заданы произвольно, орбита - эллипс, т.е. и первый закон Кеплера выполняется. Но если задать первую космическую скорость - тело улетает по параболе. Законы Кеплера и в этом случае соблюдаются, а расчёт неправильный, надо искать ошибку. И, возможно, ошибка метода проявляется именно в этом неравенстве площадей. Но это неравенство незначительно, оно, возможно, следствие машинной ошибки. Отсюда и тема - как увеличить точность вычислений для того, что бы понять, откуда растут ноги у этой ошибки. |
| Автор: Romikgy 16.3.2018, 00:38 | ||||||
https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD%D1%8B_%D0%9A%D0%B5%D0%BF%D0%BB%D0%B5%D1%80%D0%B0
нигде такого не нашел.... но если учесть что все верно , в ваших формулах, то есть один недочет со стороны математики... если первый вариант еще можно принять как треугольник, то с учетом ускорения треугольника не получится! одна сторона будет кривой... и расчет будет с ошибкой... скорости движения у вас тысячи м\с , т.е. уход за секунду будет очень большим... и разность площадей будет увеличиваться. Если дельту по времени уменьшать , возможно до миллисекунд, а может и до микро , то сторона не будет успевать изгибаться , и разница площадей будет стремится к нулю.... Добавлено через 1 минуту и 39 секунд
а что докажет , если площади совпадут ? |
| Автор: A32 16.3.2018, 01:12 | ||||
Вы, видимо, не там искали - история вопроса древняя, 17 век. Да и не надо было искать, всё доказывается на школьном уровне, здесь всё на самом деле просто. Но, если интересно, в Математических началах натурфилософии Ньютона (прилагаются) з-н Кеплера доказывается именно так, как у меня считается. Никто, вроде бы, метод не оспорил. Вы первый. Вы всерьёз полагаете, что интеграл криволинейной функции нельзя рассчитать на компьютере потому, что в расчётах используются прямоугольные отрезки? У Ньютона об этом то же есть.
Что расчёт корректен хотя бы в принципе. |
| Автор: Romikgy 16.3.2018, 10:09 | ||
это значит что я лучший ? )))
можно , но в в ваших расчетах нет интеграла ! ![]() а теперь посмотрите на то что выдает ваша программа у вас центростремительное ускорение всегда одинаково? |
| Автор: A32 16.3.2018, 15:45 |
| Если Вы решили, что центростремительное ускорение во всех точках орбиты должно быть одинаковым, то это ошибка. И я правильно понял Ваше мнение: ошибка расчётов в 0,0000000002%, случайная, не систематическая, иногда вообще равная нулю - следствие принципиально ошибочного расчёта? |
| Автор: Romikgy 16.3.2018, 22:04 | ||||
я так не решил ... я знаю что это не так Но формулы, которые вы указали в качестве доказательств правдивости закона Кеплера, говорят о том , что ускорение постоянно ... или я не правильно читаю текст .
нет , не случайная мое мнение , что при таком способе расчета площадей треугольников , это закономерная ошибка.... учитывая точность вычислений ( делал на питоне ) максимальная ошибка(ds2-ds1) при шаге по времени в 1.5 секунды за 100000 : 0.00398254394531, что соответствует ошибке в 13 знаке (это если разделить макс ошибку на макс дс) при шаге 1.5e-3 макс ошибка 4.24198806286e-05 при шаге 1.5e-5 макс ошибка 1.33877620101e-07 при шаге 1.5e-6 - ошибка уходит в ноль .... не думаю что точность в 6 порядков ... упирается в машинную ошибку вычислений... я думаю , что на таком мелком шаге, кривизна эллипса(одна сторона треугольника) выравнивается до прямой (с очень малой ошибки аппроксимации) Это мое мнение как математика и программиста , я не силен в космогонии .... могу и ошибаться, но математически считаю себя правым. |
| Автор: A32 16.3.2018, 23:37 | ||||
Вы привели этот аргумент (неравенство ускорений) как доказательство ошибочности расчётов. Отменено? И я на самом деле не понимаю, о каких формулах речь? О тех, что в макросе? Я не доказывал закон Кеплера, это сделали до меня.
Как правило, ошибка расчёта пропорциональна результату, нет ничего удивительного в том, что она уменьшается с уменьшением шага. И шаг у меня не меняется, а ошибка то есть, то нет. Но не случайная? Но чёрт бы со словом случайная, с остальным то как? (не систематическая и, временами, вообще пропадающая). Расчёты, основанные на ошибочной идее так себя не ведут. Но самое интересное вот где: утверждая некорректность моих расчётов, Вы, тем самым, объявляете некорректным доказательство Ньютона, потому, что расчёты прямо следуют из доказательства. И ко мне можно обращаться на ты. |