Задача о балке: решение I
Глядя на рис. 1.12, можно написать требуемую систему уравнений, «зажав» ее между ключевым словом Given и функцией Find (рис. 1.15). Функция Find возвращает значения переменных, превращающих вышеперечисленные (до слова Given) уравнения в тождества. Если уравнений более одного, то возвращаемые значения размещаются в векторе – в группе переменных, «зажатых в кулак». Но этот «кулак», как мы уже отмечали, легко разжать, выведя на дисплей найденные значения с любой доступной размерностью силы. Но не только этим хороша размерность в задачах. Главное то, что она позволяет автоматически отслеживать «физические» ошибки. Если, к примеру, пользователь сложит секунды с метрами, то Mathcad «заругается» и выдаст протестующее сообщение об ошибке: несовместимые единицы измерения – см. рис. 6.15, заставляющее вспомнить байки о том, как физик подколол лирика (батюшку), а студент озадачил преподавателя (см. выше).
В пункте 0 на рис. 1.15 введены пользовательские единицы измерений физических величин, связанные со встроенными.
Элегантность и простота решения системы уравнений в среде Mathcad, не требующая кодирования алгоритма или поиска соответствующей внешней процедуры, имеет и обратную сторону: у пользователя возникают естественные сомнения в правильности решения. Доверяй, но проверяй! – таким лозунгом можно прокомментировать три нижних выражения на рис. 1.15. Протестировать нужно не только компьютер, но и пользователя: правильно ли он составил исходную систему? Для этого проверяется баланс сил и моментов сил относительно другой системы координат: ось P, ось балки и момент сил вокруг катка. Все верно, идем дальше. Но сначала небольшое отступление.
Из пакета Mathcad в традиционные языки программирования может перекочевать прием, которого им так не хватает. Это задание переменным не только определенного типа (Integer, Long и т.д.), но и размерности: ньютонов, метров, угловых градусов и т.д. Такое расширение понятия переменной позволит оператору Print (если иметь в виду BASIC) выдавать на дисплей ее значение с соответствующей размерностью. Кроме того, вводом размерности можно, как и в среде Mathcad, контролировать правильность написания выражений. Контроль типа переменной в той или иной степени ведется во всех языках программирования. Некоторые версии языка BASIC запрещают писать оператор присвоения Sgn_A! = Dbl_B# + Lng_C&. В последних версиях такого ограничения уже нет. Более того, в Visual Basic введен тип переменных Variant, позволяющий перемешивать даже числовые и литерные переменные: A = "123" + 123, и никакой ошибки.
Ввод размерности в ряде случаев может и должен избавить программиста- прикладника от задания типа переменной. Пусть компилятор сам разбирается, сколько памяти ему отводить под хранение, например, значения угла с принятой в научно-технических расчетах точностью. Число байт под хранение физической величины, как правило, одно и тоже, если использовать «уравнивающие» множители милли, кило, Гига и т.д. В языке BASIC есть зачатки такого автоматического управления памятью компьютера – вспомним цепочку присвоений, когда переменные захватывают и свое значение, и размер памяти, отводимый под их хранение: A = 20%, B = 1&, C = 2.2!, D = 3.3# и Е = 4.4@. В языке программирования, встроенном в Mathcad (см. этюд 6), возможно присваивание переменным размерности (рис. 6.15).
Но нужно помнить, что более-менее сложная система нелинейных уравнений окажется не по зубам не только пакету Mathcad, но и другим мощным пакетам – Mathematica, Maple, Gauss и др. Пакет Mathcad в такой ситуации выдаст сообщение Did not find solution (Решение не найдено), заставляя пользователя поневоле переходить к полуавтоматическому режиму – менять значения начального приближения и (или) величину точности TOL (TOLerance – точность, погрешность), а также метод поиска решения (Mathcad 8) – рис. 1.8. Функция Find решает систему так, чтобы левые и правые части входящих в нее уравнений отличались на величину, не превышающую значения TOL[18]. Это предопределенная (системная) переменная среды Mathcad, хранящая по умолчанию значение 0.001, которое можно изменить, записав в Mathcad-документе выражение TOL:=0.0000001, например. Но и это часто не помогает. В коллекции автора (химика по специальности) есть Mathcad-задача поиска значения pH (водородного показателя) буферного водного раствора, сводящаяся к решению системы из восьми нелинейных алгебраических уравнений. Так вот, только при строго определенных начальных условиях пакет Mathcad находит правильное решение. Шаг влево, шаг вправо – расстрел: малейший отход от начальных условий, и слово Find «обливается кровью» и появляется соответствующее сообщение об ошибке. Но эта же задача в неограниченном диапазоне исходных данных прекрасно решается последовательными приближениями с поиском в цикле корня одного-единственного уравнения. Отход от лобовой атаки (от использования конструкции Given-Find) возможен лишь в том случае, если система уравнений не абстрактная, какие обычно приводятся в задачниках по математике, а реальная, отображающая конкретную прикладную (физическую, химическую, биологическую и т.д.) задачу. Кроме того, прикладник (физик, химик, биолог и т.д.), решая задачу, может сделать разумные допущения, линеаризирующие, например, некоторые выражения или уменьшающие их число. Другое важное преимущество метода последовательных приближений состоит в том, что прикладник, зная физику задачи, может менять точность расчетов при обработке выражений, входящих в систему. В блоке же Given-Find, как было уже отмечено, это недопустимо. В нем можно лишь смягчить эту проблему с другого конца – ввести в выражения балластные (нормирующие) коэффициенты, уравнивающие их по отношению друг к другу и позволяющие им решаться с одной точностью. А это опять же потеря физики в угоду математике. Но тем не менее все перечисленные ухищрения часто остаются тщетными из-за того, что система просто... не имеет решения, да и вся задача ориентирована не на поиск корней, а на минимизацию некоторых величин. В этом случае функция Find заменяется на функцию Minerr (MINimal ERRor). С помощью блока Given-Minerr можно решать обширный класс оптимизационных задач, о чем мы еще поговорим в этюдах 2 и 3.
А вот еще одна перефразировка: на компьютер надейся, а сам не плошай!
В том смысле не плошай, что немного подумай и подскажи компьютеру, как быстрее и точнее решить задачу. Высший компьютерный «пилотаж» помогает пользователю обходить неизбежные ошибки и неточности программной среды.
Более глубокий анализ равновесия балки позволяет описать его системой линейных алгебраических уравнений. А для решения такой задачи в пакете Mathcad есть особые инструменты – операторы и функции работы с матрицами и векторами, которые уже были использованы нами при решении задачи о купце и сукне (см. рис. 1.7). Но, решая задачу о балке поиском корня системы линейных алгебраических уравнений с коэффициентами при неизвестных, хранящихся в квадратной матрице A (см. рис. 1.16), и со свободными членами, хранящимися в векторе B, от единиц измерения приходится отказываться (пункт 1). Это потому, что элементы матриц и векторов в среде Mathcad должны либо иметь одинаковую размерность, либо быть безразмерными. А это не просто ошибка пакета, а общая методологическая ошибка: элементы матрицы должны иметь разнородные размерности.
Матрица и вектор пакета Mathcad имеют «родственников» на языке BASIC – двухмерный и одномерный массивы (см. рис. 1.7). Массив же – это объединение сугубо однотипных величин. Разнотипные переменные объединяются в запись. Массив, образно говоря, – это бутылки в ящике, а запись – бутылки в баре. Чтобы примирить физику с математикой, достаточно разрешить в столбцах матрицы помещать величины с разнородными единицами измерений, считая матрицу не только двухмерным массивом простых переменных, но и одномерным массивом векторов. В записи (в векторе) могут, конечно, храниться и однотипные переменные – переменные с одной размерностью или вообще лишенные ее. Аналог одномерного массива в Mathcad – это матрица с одной строкой (вектор-строка). Но такая «горизонтальная» матрица не выражается через переменную с нижним индексом. Переменная с индексом – это нормальный, «вертикальный» вектор (вектор-столбец). Если допустить, что матрица – собрание (множество) величин с различной размерностью, то тогда придется все матричные операторы и функции разделить на группы по отношению к единицам измерений. Так, функции min (поиск минимального элемента в массиве) и max (поиск максимального элемента в массиве) не могут допустить неодинаковых размерностей в элементах матрицы-аргумента. Оператор же определения детерминанта должен преобразовывать матрицу как массив векторов. Величины в строках здесь должны быть одной размерности.