nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Больше размерностей, хороших и разных!

Выкладываю слегка дописанную версию PhysUnitCalc, ссылка для скачивания.

Самое главное: исправлена дурацкая ошибка, из-за которой программа вообще не запускалась, если десятичным разделителем назначена точка, а не запятая (физические константы сгоряча записал в виде строк, не озаботившись их корректным разбором во всех случаях). Сейчас запускается при любых настройках, под XP, Вистой и Семеркой, должна без проблем стартовать и под Wine. Кстати, независимо от настроек системы, при работе с этим калькулятором можно писать и точки, и запятые, а ответы будут отображаться уже в соответствии с настройками.

Второе: начал потихоньку составлять документацию, какие именно величины поддерживаются, в папке с программой htm-файлы DistanceUnits, AreaUnits и VolumeUnits, это самые тяжелые были, т.к у меня работа с размерностями - крупная надстройка к старой Борландовской библиотеке ConvUtils, куда уже были занесены всевозможные футы, дюймы, акры, морские мили, фурлонги, бушели и пинты, не говоря о более экзотических величинах. Также там были альтернативные написания единиц СИ, т.е метры можно записать m, а можно Meters, а миллиметры - не только mm, но и Millimeters, почему бы и нет?

Совсем забыл сказать еще в прошлый раз: можно использовать в выражениях переменную Ans (от слова Answer), в ней хранится результат предыдущего вычисления. И еще можно в конце строки написать комментари в стиле C: все после // будет проигнорировано.

А в новой версии, окромя исправленного бага, появились новые размерности: плоские и телесные углы, а также "штуки".


Плоский угол считается производной величиной в СИ, единица - радиан. Телесный угол - тоже производная величина, единица - стерадиан. В Mathcad когда-то были введены углы, в том числе тригонометрические функции брались только от углов и ни от чего другого, но в новых версиях от углов избавились, решили, что лучше они будут просто безразмерными.

Но мне по работе с углами все время приходится сталкиваться, скажем, мы привыкли угловые скорости измерять в минутах в секунду ('/с) и секундах в секунду (''/с), но исходные данные вводятся в радианах в секунду, а начальные углы почему-то в градусах-минутах-секундах, например 120°34'33''. Соответственно, было обидно написать калькулятор с физическими размерностями и оставить этот вопрос в стороне.

У меня базовой величиной угла являются радианы (rad или рад), кроме них введен "оборот" (т.е 2π радиан, 360°), его обозначения: turn или об. И есть градусы, минуты и секунды. Градусы обозначаются: deg, град, и можно ввести знак °, для этого нужно включить num lock и при нажатом alt ввести на цифровой клавиатуре 0176.
Минуты обозначаются одним апострофом: ', секунды - двумя апострофами ('') или одной кавычкой (").

Этими величинами можно пользоваться по отдельности, например,
1 rad [°] даст ответ
57,2957795130823 °,
а 1 rad ['] даст:
3437,74677078494 '
Ну как бы без особенностей.
И есть еще одна величина, под названием dms (degrees-minutes-seconds), это те же самые градусы, но с другим отображением:
1 rad [dms] дает:
57°17'44,81"
Можно и самому вводить градусы в таком формате, сначала количество градусов, затем буква d либо символ °, затем количество минут, апостроф ', количество секунд и два апострофа или кавычка. Градусы и минуты должны быть целыми числами, а секунды могут быть и дробными. При записи числа точность не теряется, т.е если мы напишем 57°17'44,814578889'', именно в таком виде оно будет записано, насколько хватит 64-битного числа с плавающей точкой, но отображаются всегда только 2 знака после запятой у секунд, этого хватит, например, чтобы указать географические координаты места с точностью до
0°0'0,01'' * 6400 km [cm] (нажимаем enter)
31,0280755910103 cm - ошибка навигационных систем все рано выше!

Тригонометрические функции теперь требуют именно угла, но зато можно вводить хоть радианы, хоть градусы, ответ получим правильный:
sin(30 deg)
0,5
tg((pi/4) rad)
1

Тут я раз за разом ошибку допускал, писал pi/4 rad. Поскольку у операции присвоения размерности приоритет выше, это воспринималось как pi / (4 rad).

Вот мы и подходим к тому, почему в маткаде от углов избавились - да потому что радианы действительно безразмерные! Взяли мы линейную скорость, поделили на радиус, получится у нас 1/с, откуда программе знать, что там радианы должны выползти?

Но в маткаде не было того, что есть у меня - возможность объявлять единичными физические константы! Уж если мы можем написать c=1, после чего время и длина будут восприниматься как одна размерность, то ввести rad=1 и подавно не проблема!

Собственно, такое соотношение, rad=1 включено с самого начала, поэтому можно в тригонометрические функции подставлять безразмерные величины, к ним будут добавлены радианы:
sin(pi/4)
Для преобразования из [] в [rad] выражение домножено на rad
0,707106781186547

и наоборот, если формула предусматривает безразмерную величину, а мы всунули туда угол, то сначала он преобразуется в радианы, а потом эти радианы будут "аннулированы", что в большинстве случаев даст нам верный ответ. Именно так произошло, когда мы радиус Земли умножили на 0.01 угл. секунду, мы тем самым получили длину дуги.

На радостях я переопределил, что такое Герц, теперь это аналог 1 об/с. Мы можем теперь проще найти импеданс катушки индуктивности:
50 Гц * i * 2 Гн
0 + 628,318530717959i kg*(m)^2*(s)^(-3)*(A)^(-2)*rad
нуу, увы, есть свои минусы, можно написать так:
50 Гц * i * 2 Гн [Ом]
Для преобразования из [kg*(m)^2*(s)^(-3)*(A)^(-2)*rad] в [Ом] выражение домножено на (rad)^-1
0 + 628,318530717959i Ом
или так:
50 Гц [с^-1] * i * 2 Гн
Для преобразования из [Гц] в [с^-1] выражение домножено на(rad)^-1
0 + 628,318530717959i Ohm
Второе, пожалуй, понятнее.

Использование размерности углов позволяет нам избавится от назойливых 2*pi, попадающихся то здесь, то там, но может и стать источником ошибок. Увы, программа не телепат, но по крайней мере, она сообщает синим, когда делает неявные преобразования величин - так что незамеченными ее действия не пройдут.

Еще разок посчитаем энергию фотона видимого света. Длина волны - 550 нм. Что такое длина волны - это расстояние, на котором фаза волны претерпевает полный оборот, т.е правильно написать так: 550 нм/об. Тогда обратная величина будет ни чем иным, как волновым числом:
1/ 550 нм/об
11423973,2857811 (m)^(-1)*rad
Ну а волновое число, энергия - какая разница, в самом деле? По крайней мере, если мы включим c=1 и h=1, то будет именно так:
1/ 550 нм/об [эВ]
Для преобразования из [(m)^(-1)*rad] в [эВ] выражение домножено на (rad)^-1*c*h
2,25425784502506 эВ
Получаем правильный ответ - нам не пришлось писать ни заряд электрона для пересчета джоулей в электрон-вольты, ни постоянную Планка, ни скорость света для нахождения частоты, ни 2*pi.

Введена единица для телесного угла - стерадиан (sr, ср), сейчас она объявлена производной, а именно - радиан в квадрате, это вообще спорно, но кое-где срабатывает, опять же по работе. У нас есть лазерный луч с шириной 4'' и мощностью 7 Вт. Вопрос: чему равна сила излучения (мощность, отнесенная к единичному телесному углу)? Угол настолько малый, что мы кусочек единичной сферы приближенно можем считать плоскостью. На ней изображен кружок с диаметром 4''. Его площадь:
(4'')^2 * pi/4
2,95365385233766E-10 sr

Если мы посчитаем по-честному,
2*pi*(1-cos(2'')), получим
2,95365260737964E-10
тут не стоит стерадиан - ну не обладает программа телепатическими способностями!

И получается в итоге, что стерадиан тоже легко превращается в безразмерную величину и назад, не умножаясь на какие-либо константы, что весьма неплохо.

По крайней мере, можно будет ввести отдельные величины для светового потока (люмен), силы света (кд), освещенности и яркости и не путать их между собой. Under construction.

И еще одна новая величина - "штуки", шт или pcs (pieces). Она тоже по умолчанию безразмерная, используется в первую очередь как комментарий:
5 м/шт * 2 шт
10 m

К ней еще не хватает денежных величин, какого-нибудь "у.е", это тоже under construction.

И чуть не забыл: теперь и безразмерных величин стало две, одна - просто "единица", а вторая - процент (%), они просто отличаются в 100 раз:
1 % []
0,01

1 [%]
100 %

(400 K - 300 K) / 400 K [%]
25 %

Если что-то непонятно - спрашивайте, сейчас, увы, сильно не хватает нормальной документации к программе. Не знаю, когда в следующий раз за нее примусь - сдуру решил показать эту программу начальнику (она была бы очень кстати), он ее не оценил, дескать, это детские игрушки, в подметки не годящиеся обычному калькулятору windows, а я фигней занимаюсь вместо того, чтобы придумывать, как с МКС передать 10 Гбит/с на Землю, в понедельник вечером я узнал о такой задачке, и к четвергу так и не придумал - вот ведь незадача!
Tags: physunitcalc, математика, программки
Subscribe

  • Очередная несуразность в единицах измерения

    Когда-то я написал программу PhysUnitCalc - калькулятор, умеющий работать с размерностями. Мне казалось, что я наступил уже на все грабли, которые…

  • Big Data, чтоб их... (3)

    "В предыдущих сериях": мой прибор выдаёт 6 значений: 3 координаты и 3 угла, т.е все 6 степеней свободы твёрдого тела. Причём ошибки измерения этих 6…

  • Big Data, чтоб их... (2)

    Вчера получил упоротое уравнение, чтобы найти, с какими весами нужно брать результаты измерений, чтобы получить наименее шумную и при этом…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 2 comments