Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Dimensional Analysis

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 40. Boost.Units 1.1.0

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Понятиеразмерного анализаобычно представлено на ранней стадии во вводных классах физики и техники как средство определения правильности уравнения или вычисления путем распространения физического измеренияединицразличных величин через уравнение вместе с их числовыми значениями. Существует ряд стандартных единичных систем, наиболее известным из которых являетсяSysteme International(также известный как SI или MKS (метр-килограмм-секунда), который был метрическим предшественником системы SI, названной в честь трех базовых единиц, на которых основана система). SI является единственной официальной международной стандартной системой и широко используется в науке и технике. Другие распространенные системы включают системуCGS(сантиметр-грамм-секунда) и системуEnglish, все еще используемую в некоторых проблемных областях в Соединенных Штатах и в других местах. В физике также существует ряд других систем, которые широко используются в специализированных дисциплинах. Они называютсянатуральными единицами. Когда величины, представляющие различные измеримые величины, объединяются, размерный анализ обеспечивает средства оценки согласованности полученного расчета. Например, сумма двух длин также является длиной, в то время как произведение двух длин является областью, а сумма длины и области не определена. Тот факт, что аргументы для многих функций (таких как exp, log и т.д.) должны быть безразмерными величинами, может быть легко продемонстрирован путем изучения их последовательного расширения в контексте размерного анализа. Эта библиотека облегчает применение такого рода ограничений в коде, включающем размерные величины.

В следующем обсуждении мы рассматриваем размерный анализ как абстракцию, в которой произвольный наборединицподчиняется правилам конкретной алгебры. Мы будем ссылаться на пару базового измерения и рационального экспонента как нафундаментальное измерениеи список, состоящий из произвольного числа фундаментальных измерений как насоставное измерениеили простоизмерение. В частности, учитывая наборform_0фундаментальных измерений, обозначаемыхform_1, и наборform_0рациональных экспонентовform_2, любое возможное (составное) измерение может быть записано какform_3.

Композитные измерения подчиняются алгебраическим правилам размерного анализа. В частности, для любого скалярного значенияform_4и составных размеровform_5иform_6, гдеform_7, мы имеем:

form_8

Пользователи библиотеки размерного анализа должны иметь возможность указать произвольный список базовых измерений для получения композитного измерения. Это может включать в себя повторные теги. Например, можно выразить энергию какform_9,form_10,form_11или любую другую перестановку массы, длины и времени, имеющую совокупные экспоненты 1, 2 и -2 соответственно. Для того чтобы иметь возможность выполнять вычисления на произвольных наборах измерений, все составные измерения должны быть сведены к однозначному окончательному составному измерению, которое мы будем называтьуменьшенным измерением, для которого

  1. Фундаментальные измерения последовательно упорядочены
  2. Размеры с нулевым показателем ускользают. Обратите внимание, что уменьшенные размеры никогда не имеют болееform_0базовых размеров, по одному для каждого отдельного фундаментального измерения, но могут иметь меньше.

В нашей реализации размеры базы связаны с типами тегов. Поскольку мы в конечном итоге будем представлять композиционные измерения в виде списков типов, мы должны предоставить некоторый механизм сортировки базовых размерностей, чтобы сделать возможным преобразование произвольного композитного измерения в уменьшенное измерение. Для этого мы присваиваем каждому базовому измерению уникальное целое число. Класс<base_dimension>(найден в<boost/units/base_dimension.hpp>) использует любопытно повторяющийся шаблон (CRTP) метод, чтобы гарантировать, что порядки, указанные для размеров основания, являются уникальными:

template<class Derived, long N> struct base_dimension { ... };

С помощью этого мы можем определить базовые размеры для длины, массы и времени как:

/// base dimension of length
struct length_base_dimension : base_dimension<length_base_dimension,1> { };
/// base dimension of mass
struct mass_base_dimension : base_dimension<mass_base_dimension,2> { };
/// base dimension of time
struct time_base_dimension : base_dimension<time_base_dimension,3> { };

Важно отметить, что выбор порядка является полностью произвольным, если каждый тег имеет уникальное числовое значение; неуникальные порядки помечаются как ошибки во время компиляции. Отрицательные порядки зарезервированы для использования библиотекой. Для определения композитных размеров, соответствующих размерам основания, мы просто создаем MPL-соответствующие списки типов фундаментальных измерений, используя класс<dim>для инкапсуляции пар размеров основания и<static_rational>экспонентов. Класс<make_dimension_list>действует как обертка для обеспечения того, чтобы полученный тип имел уменьшенную размерность:

typedef make_dimension_list<
    boost::mpl::list< dim< length_base_dimension,static_rational<1> > >
>::type   length_dimension;
typedef make_dimension_list<
    boost::mpl::list< dim< mass_base_dimension,static_rational<1> > >
>::type     mass_dimension;
typedef make_dimension_list<
    boost::mpl::list< dim< time_base_dimension,static_rational<1> > >
>::type     time_dimension;

Это также может быть легко выполнено с помощью удобного типдефа, предоставленного<base_dimension>:

typedef length_base_dimension::dimension_type    length_dimension;
typedef mass_base_dimension::dimension_type      mass_dimension;
typedef time_base_dimension::dimension_type      time_dimension;

Таким образом, приведенный выше код идентичен полному определению списка типов. Композитные размеры также определяются с помощью списка типов:

typedef make_dimension_list<
    boost::mpl::list< dim< length_base_dimension,static_rational<2> > >
>::type   area_dimension;
typedef make_dimension_list<
    boost::mpl::list< dim< mass_base_dimension,static_rational<1> >,
                      dim< length_base_dimension,static_rational<2> >,
                      dim< time_base_dimension,static_rational<-2> > >
>::type    energy_dimension;

Предоставляется также класс удобства для композитных размеров с целыми полномочиями:

typedef derived_dimension<length_base_dimension,2>::type  area_dimension;
typedef derived_dimension<mass_base_dimension,1,
                          length_base_dimension,2,
                          time_base_dimension,-2>::type   energy_dimension;


PrevUpHomeNext

Статья Dimensional Analysis раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 40. Boost.Units 1.1.0 может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 40. Boost.Units 1.1.0 ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:53:08/0.0098609924316406/1