Святослав И Пользователь Сообщений: 30 Святослав И |
#1 29.10.2017 11:50:26 Здравствуйте, Друзья, поддержите, если возможно советом. За последние неск. дней все мозги сломал, но так и не нашёл ошибки. Подозреваю, что банально замылился глаз и не вижу того, что лежит под носом. Итак, есть стандарт . В нём приведены чёткие уравнения и алгоритмы расчёта плотности нефтепродуктов, в зависимости от температуры/давления. Вот примерная схема расчётов:
С этим вроде как всё ясно и понятно. Изначальная задача: вывести р15 из замеров топлива, находящегося в произвольном состоянии. На основании вышепривёдённых данных, родился следующий текст в VBA:
И вроде бы всё хорошо. Но, не всё хорошо. Считает не правильно. В том же стандарте приводится пример для расчёта. Следуя которому — мною написанное даёт иные результаты. Вот пример:
Прицепил файлик, в котором играюсь. Буду крайне признателен, если ткнёте носом в ошибку! Прикрепленные файлы
Изменено: Святослав И — 29.10.2017 15:45:14 |
||||
panix1111 Пользователь Сообщений: 149 |
#2 29.10.2017 13:27:58 округляете же сами, типы переменных для такой точности надо указывать
по примеру дает ответ 827.3113441474 стоп, там еще есть ошибки. плюс не учтены все коэфициенты в Юзерфкнкции Изменено: panix1111 — 29.10.2017 13:41:33 Мы в Екселе не работаем, мы в нём живём! |
||
Святослав И Пользователь Сообщений: 30 Святослав И |
#3 29.10.2017 13:45:38
Проблема не в округлениях. Там точность в худшем случае пострадает. Проблема в том, что он в принципе неверно считает. Грубо говоря, при пересчёте из более высокой температуры в более низкую — плотность должна возрастать (что, как минимум, логично), а она — уменьшается. Другими словами: если при температуре +27, плотность солярки 840, то при +15 она должна быть +845, а не — 835. Если взять конкретный пример и первого поста: там при t=27,3 плотность = 836,15 Изменено: Святослав И — 29.10.2017 13:47:52 |
||
Святослав И Пользователь Сообщений: 30 Святослав И |
#4 29.10.2017 13:50:45
Да вроде всё учёл…. всего-то три уравнения задействованы… что до ошибок — разумеется они есть ) если бы их не было и вопрос бы не стоял )) |
||
panix1111 Пользователь Сообщений: 149 |
Пошаговый прогон показывает, что проблема в ф-ле Yt, так b15 выдает значение как и в ГОСТ-примере, а вот Yt = 8.1328 (должно быть 8,148) Изменено: panix1111 — 29.10.2017 15:00:01 Мы в Екселе не работаем, мы в нём живём! |
Hypohelix Пользователь Сообщений: 108 |
У меня возникло такое ощущение, что в стандарте где-то что-то пропущено. У меня в результате вычислений получаются те же цифры, что и у Вас. При этом, более-менее близкие к примеру цифры получаются только при убирании знака минус в формуле 1 у коэффициента Б15. Программный код, как и яды, лучше тестировать по капельке |
Святослав И Пользователь Сообщений: 30 Святослав И |
#7 29.10.2017 15:04:33
В прицепленом файлике, на листе «Руками» — я простыми формулами посчитал — и там, в первом приближении — значение коэффициента Yt — в точности совпадает со значением из примера.
Хм… Так вроде в алгоритме указано использовать именно замеренную температуру то есть PtP… Пошёл читать в сто первый раз алгоритм… Вот же:
В рассматриваемом примере мы выводим именно p15
Угу…. тоже игрался с этими минусами… И потом — вряд ли в госте напортачили… Я сверялся с предыдущими гостами — там практически те же самые формулы используются… Изменено: Святослав И — 29.10.2017 17:25:11 |
||||||||
panix1111 Пользователь Сообщений: 149 |
#8 29.10.2017 19:57:32 хм, таки да а вот числитель действительно дает разницу (-) перед В15 (old_dens * Exp(b15 * (t — 15) * Abs((1 + 0.8 * b15 * (t — 15))))) (old_dens * Exp(-b15 * (t — 15) * Abs((1 + 0.8 * b15 * (t — 15))))) что то там не то с вычислениями
Да, разобрался, таки надо указывать давление, если ставить ссылочку на третий параметр, то выходит так же как и в вашем варианте «вручную» = 828.7441072774 Изменено: panix1111 — 29.10.2017 19:58:16 Мы в Екселе не работаем, мы в нём живём! |
||
Святослав И Пользователь Сообщений: 30 Святослав И |
#9 29.10.2017 20:06:02
Угу, мягко говоря — не то… Настолько не то, что оно уходит в противоположном направлении. С другой стороны, вот ещё раз формула: как вот её ещё можно понять иначе? У меня, грешным делом, была мысль, что скобки квадратные-фигурные каким-то образом могут влиять на очерёдность вычислений… Изменено: Святослав И — 29.10.2017 20:07:13 |
||
panix1111 Пользователь Сообщений: 149 |
#10 29.10.2017 20:23:32
квадратные — это модуль, я его в последнем варианте на всяк случай добавил в ф-лу (Abs), но всё равно что-то не сходится с расчетами из примера. Мы в Екселе не работаем, мы в нём живём! |
||
Святослав И Пользователь Сообщений: 30 Святослав И |
#11 29.10.2017 20:35:31
Да, такой вариант, за неимением лучшего, я уже приспособил и что-то оно вычисляет. Но. Погрешности к сож., слишком велики. Велики на столько, что всю ценность вычислений сводят на «нет». Ну то есть, грубо говоря, на бензовозе в котором плещется 22-23 тонны солярки — литров 200 свободно «гуляет» туда/сюда только на этих знаках после запятой… Соответственно, какие-то недоливы/сливы можно даже не пытаться ловить, соответственно — про какой-либо вменяемый учёт/контроль можно забывать… Просто я покурил форумы метрологов и там вполне чётко прослеживается мысль, что только вот эти формулы… |
||
panix1111 Пользователь Сообщений: 149 |
#12 29.10.2017 21:16:24 там есть такой момент:
Изменено: panix1111 — 29.10.2017 21:22:43 Мы в Екселе не работаем, мы в нём живём! |
||
Святослав И Пользователь Сообщений: 30 Святослав И |
#13 29.10.2017 21:28:58 panix1111, так я ровно о том же самом написал в #7 -ом сообщении. Фишка в том, что мы как раз вычисляем именно р15, а не РtP… В алгоритме подстановок вроде об этом явно написано, или я как-то не так его читаю?
Хотя вот начиная с этого пункта возникает некоторая неопределённость. Но опять же. Начиная с самой первой подстановки полученных b15 и Yt (значения которых, кстати, вычисляются чётко по примеру) — формула возвращает неверное значение, т.е. уже на самом первом шаге. Изменено: Святослав И — 29.10.2017 21:56:30 |
||
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
Святослав И, размещаете тему на нескольких форумах — информируйте об этом. |
panix1111 Пользователь Сообщений: 149 |
#16 29.10.2017 22:25:08 грубый хак, но расчет соответсвует гост-примеру:
где 14.645 — просто ручками подобранный кофициэнт Мы в Екселе не работаем, мы в нём живём! |
||
Святослав И Пользователь Сообщений: 30 Святослав И |
#17 29.10.2017 22:55:38
На других вводных, значения этого «коэффициента» будут другими. Что делает такое решение не вполне жизнеспособным…КМК… )) |
||
С.М. Пользователь Сообщений: 936 |
#18 29.10.2017 22:56:47
Изменено: С.М. — 30.10.2017 21:43:01 |
|
Святослав И Пользователь Сообщений: 30 Святослав И |
С.М., А можно в двух словах буквально? Но в любом случае — спасибо. Опробую, отпишусь. Изменено: Святослав И — 29.10.2017 23:03:53 |
С.М. Пользователь Сообщений: 936 |
#20 29.10.2017 23:27:21
На одном листе: Прикрепленные файлы
|
||
Святослав И Пользователь Сообщений: 30 Святослав И |
С.М., см. лист «Анализ» — референсные данные из примера и рядом то, что выдают формулы. Изменено: Святослав И — 30.10.2017 09:00:56 |
Святослав И Пользователь Сообщений: 30 Святослав И |
Нас нае… обманули. Расходимся. Оказывается (!!!) для того чтобы формула из стандарта, вот эта: Работала правильно для приведения PtP в P15, её всего лишь (!!!) нужно перевернуть. Вот так: И тогда всё внезапно начинает правильно работать. То, что в ГОСТе забыли об этом написать, ну так то мелочи. Нет слов. P.S. Это мне народ на метрологическом форуме подсказал. Для них это — нечто само собой разумеющееся. Изменено: Святослав И — 01.11.2017 22:48:23 |
С.М. Пользователь Сообщений: 936 |
Святослав И
, извините, а что Вы рассчитывали на листе Анализ ? Плотность при t=15 и P=0 или какую ? Ещё, в РЕКОМЕНДАЦИИ написали: итерационный метод прямых подстановок «, Изменено: С.М. — 30.10.2017 12:07:15 |
С.М. Пользователь Сообщений: 936 |
Тьфу, картинка не появилась. Дублирую: |
Святослав И Пользователь Сообщений: 30 Святослав И |
#25 30.10.2017 12:13:54
Я ничего не забыл. В стандарте об этом ни слова. К слову, я там выше привёл формулу, по которой оно сработало. Как и ваша. |
||
С.М. Пользователь Сообщений: 936 |
Возвращаю файл (с вопросом): |
С.М. Пользователь Сообщений: 936 |
#27 30.10.2017 12:43:31
Не, хорошо, что в реальном мире МашиныВремени — не существует ! . |
||
Святослав И Пользователь Сообщений: 30 Святослав И |
#28 30.10.2017 12:58:00
В файле, то что вы VBA проделываете с помощью цикла, я просто разложил на листе — для большей наглядности. Так лучше видно — на какой итерации какие результаты выходят. Собственно, debug.print в консоль (в вашей функции) приносит ровно те же результаты. То, что я пытался делать — привести плотность при 27,3°С в плотность при 15°С, при том же P (т.е. 2,45 МПа) для пересчёта в другое значение P — там есть свои формулы. При этом чётко следовал, рекомендациям, о том, что дескать нужные значения просто подставить в ту же формулу (1). То, что вычислять нужно на перевёрнутой формуле — ребята забыли упомянуть (равно как и привести её). Ну что ж, бывает… Ещё раз, всем спасибо за посильное участие и помощь. |
||
С.М. Пользователь Сообщений: 936 |
#29 30.10.2017 13:02:15
https://www.youtube.com/watch?v=Q-KCknBxVtg |
||
С.М. Пользователь Сообщений: 936 |
#30 30.10.2017 21:07:43 Аааааа ! Нашёл у себя в коде ошибку — запутался в скобках (и на старухъ бывает прорух). Прикрепленные файлы
Изменено: С.М. — 30.10.2017 21:42:01 |
Здравствуйте,
Друзья, поддержите, если возможно советом. За последние неск. дней все мозги сломал, но так и не нашёл ошибки. Подозреваю, что банально замылился глаз и не вижу того, что лежит под носом.
Итак, есть стандарт. В нём приведены чёткие уравнения и алгоритмы расчёта плотности нефтепродуктов, в зависимости от температуры/давления. Вот примерная схема расчётов:
С этим вроде как всё ясно и понятно. Изначальная задача: вывести р15 из замеров топлива, находящегося в произвольном состоянии. На основании вышепривёдённых данных, родился следующий текст в VBA:
[vba]
Код
Function P_to_15(dens, temp, Optional p)
k0 = 613.9723
k1 = 0
k2 = 0
If IsMissing(p) = True Then
p = 0
End If
old_dens = 0
new_dens = dens
Do Until Abs(new_dens — old_dens) = 0
b15 = ((k0 + k1 * new_dens) / new_dens ^ 2) + k2
Yt = 10 ^ -3 * Exp(-1.6208 + 0.00021592 * temp + ((0.87096 * 10 ^ 6) / new_dens ^ 2) + ((4.2092 * temp * 10 ^ 3) / new_dens ^ 2))
old_dens = new_dens
new_dens = (dens * Exp(-b15 * (temp — 15) * (1 + 0.8 * b15 * (temp — 15)))) / (1 — Yt * p)
Loop
P_to_15 = Application.Round(new_dens, 2)
End Function
[/vba]
И вроде бы всё хорошо. Но, не всё хорошо. Считает не правильно. В том же стандарте приводится пример для расчёта. Следуя которому — мною написанное даёт иные результаты. Вот пример:
Грубо говоря, при пересчёте из более высокой температуры в более низкую — плотность должна возрастать (что, как минимум, логично), а она — уменьшается. Другими словами: если при температуре +27, плотность солярки 840, то при +15 она должна быть +845, а не — 835.
Если взять конкретный пример: при t=27,3 плотность = 836,15
в результате первого приближения, при приведении к t=15 — формула должна выдать — 843,62, а она выдаёт — 827.31…. в чём собственно и состоит затык…
Прицепил файлик, в котором играюсь. Буду крайне признателен, если ткнёте носом в ошибку!
Здравствуйте,
Друзья, поддержите, если возможно советом. За последние неск. дней все мозги сломал, но так и не нашёл ошибки. Подозреваю, что банально замылился глаз и не вижу того, что лежит под носом.
Итак, есть http://u.to/GB9REA. В нём приведены чёткие уравнения и алгоритмы расчёта плотности нефтепродуктов, в зависимости от температуры/давления. Вот примерная схема расчётов:
http://i89.fastpic.ru/big/2017/1029/c2/248616be79a64d2ea8832255df1f7dc2.png
С этим вроде как всё ясно и понятно. Изначальная задача: вывести р15 из замеров топлива, находящегося в произвольном состоянии. На основании вышепривёдённых данных, родился следующий текст в VBA:
Function P_to_15(dens, temp, Optional p)
k0 = 613.9723
k1 = 0
k2 = 0
If IsMissing(p) = True Then
p = 0
End If
old_dens = 0
new_dens = dens
Do Until Abs(new_dens - old_dens) = 0
b15 = ((k0 + k1 * new_dens) / new_dens ^ 2) + k2
Yt = 10 ^ -3 * Exp(-1.6208 + 0.00021592 * temp + ((0.87096 * 10 ^ 6) / new_dens ^ 2) + ((4.2092 * temp * 10 ^ 3) / new_dens ^ 2))
old_dens = new_dens
new_dens = (dens * Exp(-b15 * (temp - 15) * (1 + 0.8 * b15 * (temp - 15)))) / (1 - Yt * p)
Loop
P_to_15 = Application.Round(new_dens, 2)
End Function
И вроде бы всё хорошо. Но, не всё хорошо. Считает не правильно. В том же стандарте приводится пример для расчёта. Следуя которому — мною написанное даёт иные результаты. Вот пример:
http://i91.fastpic.ru/big/2017/1029/f6/8ed7217855040fd4ca8bd1882fe0f5f6.png
Грубо говоря, при пересчёте из более высокой температуры в более низкую — плотность должна возрастать (что, как минимум, логично), а она — уменьшается. Другими словами: если при температуре +27, плотность солярки 840, то при +15 она должна быть +845, а не — 835.
Если взять конкретный пример: при t=27,3 плотность = 836,15
в результате первого приближения, при приведении к t=15 — формула должна выдать — 843,62, а она выдаёт — 827.31…. в чём собственно и состоит затык…
Прицепил файлик, в котором играюсь. Буду крайне признателен, если ткнёте носом в ошибку!
Вид топлива
Тип пересчета
Исходная температура, °C
Исходная плотность, кг/м3
Температура для пересчета, °C
Расчетная плотность при новой температуре: кг/м3
При изменении температуры среды плотность нефтепродуктов меняется, что важно для их учета и расчета стоимости за литр (при росте температуры плотность снижается, и наоборот).
Калькулятор ниже служит для теоретического пересчета плотности нефтепродукта при одной температуре на плотность при второй. Расчет основан на данных таблицы пересчета согласно ГОСТ 8.599 — 2010 и ГОСТ 3900.
Калькулятор плотности
Здесь приведен расчёт плотности нефтепродукта при указанной температуре.
При температуре | °C | Плотность | кг/м3 |
При температуре | °C | Плотность |
Результаты расчета
Плотность при 20°С | 834 кг/м3 |
Плотность при -12°С | 857 кг/м3 |