Раздел: Документация
0 ... 42 43 44 45 46 47 48 ... 177 Пример 4.16. Решение системы линейных уравнений
Linear(M,N) :- "Matrix is singular" if м - О M~ lN otherwise Unear(Ml,Nl) = "Matrix is singular" Linear(M2(N2) r13.49P -S.642 ч 0.849 j Для закрепления материала подробно разберем решение несколько более сложной задачи, сочетающей как условия, так и циклы. Пример 4.17. Вектор коэффициентов полинома coeffs(polinom) :< D(x,n) «--pounom()0 dx n +- 0 while пш ли * 0 v d( i, ;u * u n в! D О + ] if a >5 14- "Too high power" fl(r):- x* + Зх2 + x + I coefftffl) » "Too high power" ВЦ, + x-7 coe№(f2) -7N 1 Щх) cocfh.x —> i о V i В примере 4.17 приведена программа, которая решает ту же задачу, что и оператор coetrs панели Symbolic (Символьные): создает вектор из коэффициентов полинома Эта программа последовательно вычисляет производные членов полинома При этом на каждом шаге появляется свободный член, который можно вычислить как значение функции производной в нуле. Нетрудно догадаться, что, поделив полученное значение свободного члена на факториал порядка той производной, при вычислении которой этот свободный член был получен, можно узнать величину коэффициента. Как вы видите, математически все очень просто. Однако даже в такой простой задаче есть несколько технических тонкостей. □ Условие продолжения работы никла. В нашей программе оно определено тем, что значения функции производной рассматриваемого порядка в точках дгМ) и х- \ не должны одновременно равняться 0 (такое равенство возможно в подавляющем большинстве случаев, только если сама производная есть 0), Важным моментом является то, в какой форме будет записан комплекс условий. Цикл должен продол- 4.5. Перехват ошибок (on error) «. 149 жать работу, лаже если одно из условий не выполняется. Значит, для связки условий нужно использовать логическое ИЛИ w». □Производные в программе вычисляются локальной функцией D(x,n). Однако ia-кую функцию можно создать только в Mathcad 12. Если бы данная программа писалась в Mathcad 11, то функцию D(x.n) пришлось бы задать как глобальную выше программы. □Использование оператора кратного дифференцирования ограничивает возможности программы, поскольку высшая степень производной, которая может быть вычислена, равна пяти. В том случае, если степень полинома окажется выше четырех, будет выдано сообщение об ошибке: This Number must be between 0 end 5 (Это число должно быть между 0 и 5). Дабы избежать ошибки, с помощью оператора if прописываем условие, что если п превышает пять, то работа программы должна быть остановлена (оператор break) и в качестве ответа выдано сообщение Too high power (Слишком высокая степень). Для того же, чтобы написать программу, способную создавать вектор иа коэффициентов полинома более высокой степени, нужно совместить несколько операторов кратного дифференцирования. Все рассмотренные выше программы по уровню сложности можно отнести к элементарным к легким. В дальнейшем мы будем писать куда более сложные алгоритмы. И если сейчас вам что-то кажется недоступным и непонятным — не стоит огорчаться! Немного практики — и вскоре вы без особого труда будете писать даже самые нестандартные программы. 4.4. Возврат значений (return) С помощью оператора return (Возвратить) можно прервать работу программы и возвратить некоторое значение. Обычно данный оператор используется при описании действий алгоритма в случае ошибочной ситуации. Впрочем, зачастую применение return избавляет от необходимости использовать оператор otherwise (Иначе), способствуя тем самым упрощению программы. Пример 4.18. Использование оператора return (на примере создания функции, вычисляющей сумму п членов гармонического ряда) Gann(n) — return "Error" if n £ 0 v trunc(n) * n G«m(-6) - "Error" Garm(l.l) = "Error" Z *- hH>) + 0.5772 othcrwi*I ООО ZGarni (1000j « 7,485 4.5. Перехват ошибок (on error) Любая вычислительная схема или математическая модель мажет работать корректно только при определенных условиях и ограничениях. Так, например, в большинстве методов численного решения уравнений обязательным требованием на каждом шаге работы алгоритма является то. что производная не может принимать значение, равное 0. Если же окажется так, что очередное приближение приведет к необходимости произвести подсчет вблизи экстремума или точки разрыва, то возникнет неопределенность, работа программы будет остановлена и будет выдано сообщение об ошибке. Однако избежать подобных ситуаций все же можно Для этого следует использовать специальный оператор обхода ошибки on error (вводится также сочетанием Ctrl+«»): I on error I Данный оператор по своему синтаксису полностью соответствует условному оператору ff. В правый его маркер следует ввести величину или выражение, ошибка в вычислении которого должна быть зарегистрирована. В левом маркере следует прописать условие, которое должно быть выполнено при возникновении ошибочной ситуации, В лучшем случае таким образом можно исправить или обойти возникшую проблему. Так, при численном решении уравнения, если приближение оказывается в окрестности экстремума и возникает ошибка при делении на производную, можно, используя оператор on error, не допустить остановки работы алгоритма вэ-за такой незначительной трудности. Для этого нужно просто прибавить к значению приближения небольшую величину (данное условие прописывается в левом маркере оператора ошибки.а в правый соответственно заносится сама расчетная формула). Это, с одной стороны, ничего не изменит в эффективности определения результата, с другой — позволит предельно просто разрешить трудную ситуацию. Пример 4.19. Создание функции численного решения уравнений с использованием оператора on error Nev(f,xO.TOL) := dx while fxn)J2TOL *~ jr + 0,0001 on error x n+ L f(x) :<= x - sin(x)-x+ 1 Nev(f, 1,0.0001) = -0.77246 fr-G.77246)=-2.18x 10 ,- 5 11+1 В некоторых случаях (когда причина сбоя точно известна) оператор ошибки может быт* заменен условным оператором. Так, условие обхода проблемной ситуации в примере 4.19 можно задать и как; х <- х + 0.0001 if п в В тех случаях, когда разрешить возникшую проблему невозможно, следует ограничиться выводом сообщения, раскрывающего причину остановки программы. Сделать это можно очень просто, присвоив переменной, значение которой выводится как ответ, соответствующую текстовую строку. 0 ... 42 43 44 45 46 47 48 ... 177
|