Численное решение задачи Коши (иллюстрация цикла while)
На рис. 6.3 представлены программы численного решения дифференциального уравнения методом Эйлера и методом Рунге ¾ Кутты 4-го порядка. Ядро программ – цикл while. Созданные программно функции Euler и RK4 возвращают значение (в случае системы уравнений – вектор значений) неизвестного выражения, являющегося решением обыкновенного дифференциального уравнения (системы). Аргументы функций Euler и RK4: х1 – значение (вектор значений в случае системы) искомого выражения в начале отрезка интегрирования (решается задача Коши), t1 и t2 – интервал интегрирования, n – число шагов интегрирования и f – правая часть дифференциального уравнения (в случае системы f – вектор-выражение). Функции Euler и RK4 протестированы на расчете числа е (численное решение задачи Коши для дифференциального уравнения х’ = х) и на задаче об эпидемии, которая нами уже была решена встроенными средствами Mathcad (см. рис. 5.2) функцией rkfixed. Программой же на рис. 6.3 мы как бы раскрываем алгоритм работы функции rkfixed. Читатель может доработать функции Euler и RK4 так, чтобы они возвращали решение не только в конечной точке интегрирования, но и на всем интервале интегрирования. Так работает встроенная функция rkfixed.
В программах на рис. 6.3 записаны комментарии – названия функций. Mathcad, к сожалению, не имеет стандартных средств комментирования программ, поэтому мы поступили так – записали в текст программы текстовую константу “Метод Эйлера” и “Метод Рунге ¾ Кутты 4-го порядка”. Комментарии в тексте программ компилятором игнорируются[10], но они помогают читающему программу понять, что здесь имелось в виду, почему тут был использован данный оператор, а не другой и т.д. В программе без комментариев через некоторое время не сможет разобраться (а тем более подправить или развить ее) даже автор.
Кнопка
позволяет вводить в программу альтернативу с одним плечом. Так, Pascal-конструкция:if A > B then C := D
в среде Mathcad будет выглядеть несколько по-арабски (по-еврейски – записана справа налево):
С ¬ D if A > B.
Но если плечо альтернативы – составной оператор, то все встанет на свои места, вернее, будет записано по-китайски (сверху вниз):
Pascal:
if A>B then begin E:=F; F:=G end[11];
Mathcad:
if A>B |
E¬F F¬G |
Pascal: |
if A > B then C := D else E := F; |
Mathcad: |
C ¬ D if A > B |
E ¬ F otherwise |
C¬if(A > B, D, F) или if(A > B, C¬D, E¬F)
Понять, почему в Mathcad не было использовано традиционное слово else, можно, если принять во внимание то, что операторы if и otherwise позволяют записать в программах алгоритмическую конструкцию множественное ветвление. Разберем ее на примере задачи о расчете налогов (федеральный налог США с недельного заработка).