Гурский Д., Турбина Е. - Вычисления в MathCad 12 (1077322), страница 40
Текст из файла (страница 40)
По завершении работы цикла счетчик должен быть возвращен программой как результат ее работы.В коде функция checker будет иметь следующий вид:checker(i,j,field) :=free_position <— Оfor к e 0.. 7continueon error fieldil.jlfree_positionfree_position + 1 if field, . - 0free_positionОбратите внимание, как в коде функции checker учитывается, что вычисленные индексы могут соответствовать не существующей реально клетке. Для этого используетсяоператор on error. Как вы помните, выражение в левом маркере данного оператора проделывается тогда, когда выполнение выражения в правом маркере приводит к возникновению ошибки.
Если индексы не определяют конкретного элемента field, системазарегистрирует ошибку. При этом будет активизирован оператор continue и цикл перейдет к следующей итерации.Далее мы должны создать функцию, которая будет определять, в какую из свободных клеток нужно сделать ход с учетом правила Вансдорфа. Называться она будет optim_step.Параметры у нее будут следующие: индексы клетки, в которой находится конь, и матрица с информацией о предыдущих ходах фигуры. Алгоритм функции optim_step несложен.1. Запускаем цикл, перебирающий все варианты хода.2. Перейдя к очередному варианту хода, вычисляем индексы и проверяем, соответствуют ли они существующей и непосещенной еще клетке.
Если необходимые условия не выполняются, переходим сразу на следующую итерацию.3. Если клетка существует и свободна, вычисляем ее «рейтинг» посредством созданной ранее функции checker. Далее сравниваем полученное значение со значениемпеременной min_res, в которой хранится наименьший рейтинг из определенных напредыдущих шагах (изначально min_res необходимо присвоить значение, заведомо превосходящее наибольший из возможных рейтингов, то есть 8). Если рейтингклетки оказывается меньше значения min_res, данную переменную следует переопределить, присвоив ей его значение.
Также при этом в переменную best_step необходимо занести индекс вектора, описывающего данный ход.4. В качестве результата работы функции нужно возвратить переменную best_step,хранящую индекс вектора вложенного вектора step, который соответствует ходув клетку, из которой можно сделать наименьшее число ходов.4.9. Пример программирования: решение задачи Эйлера о ходе коня* 165На языке программирования функция optim_step может быть реализована следующимобразом:optim_step(i,j, field) :=min_res <— 10for keO.,7continueon error field. .,il,jlres <- checker(il,jl,field)continueif field.
-, = 0otherwise(beststep <r- к minres <- res) if res < min_resbest_stepНаписанные выше функции лишь вспомогательные. Непосредственно маршрут будетопределять функция solver. У нее будет три параметра: размерность матрицы, которуюнужно обойти, и индексы клетки, с которой необходимо начать движение. Алгоритмфункции solver будет следующим.1. Сначала, используя созданную еще для рекурсивного алгоритма функцию chess_field,создаем описывающую поле матрицу field.
Далее переопределяем значение элемента field, соответствующего клетке, с которой начинается обход, с 0 на 1.222. Запускаем цикл из п -1 итераций, где п — размерность матрицы (не п , так как первый ход делается вручную).3. На каждой итерации осуществляем один шаг вперед. Для этого с помощью функции optim_step определяем, в каком векторе вложенного вектора step находятсясмещения, описывающие нужный ход. Зная смещения, легко найти индексы клетки. Ход в нее должен заключаться в том, что значение соответствующего ей элемента матрицы field должно переопределяться с 0 на номер данного хода.4.
В качестве результата работы функции возвращаем матрицу field, содержащую маршрут обхода поля.Код функции solver:solver(n,i_first,j_first) :=field <- chess_field (n)field c , . c t <- 1i_first,j_nrst(i <- i_first j <- jfirst)for k e 2 .
. n 2next_step <-optim_step(i,j,field)^Г i <r- i + (stepV ^nextstepA,field. . < - ki.Jfieldj <- j + (step^ 1Vnextstep/.166 •Глава 4. ПрограммированиеГотово. Проверяем эффективность созданной программы для матрицы 8x8 в случаеиспользования в качестве начальных двух разных клеток:f55 64 13 32 47 28 11 3014 33 54 57 12 31 48 2763 56 61 46 53 50 29 1034 15 58 51 60 43 26 49solver(8,4,0) =solver(8,3,3) =1 62 45 42 19 52 9 4016 35 20 59 44 41 6 2521 2 37 18 23 4 39 81^36 17 22 3 38 7 24 5 у27 30 17 34 45 64 15 36>18 33 28 57 16 35 44 6129 26 31 46 63 60 37 1432 19 58 1 56 47 62 4325 2 55 52 59 42 13 3820 51 22 41 48 53 10 73 24 49 54 58 39 1250 21 4 23 40 11 69Правило Вансдорфа доказало, что его не зря помнят уже почти 200 лет.
Решение былонайдено верно для обеих клеток, причем сделано это было за мгновение. Аналогичноможно найти маршрут обхода и очень больших полей, например 100x100 клеток. Времени на это потребуется также довольно немного.Правило Вансдорфа очень часто дает возможность завершить маршрут обхода, дажеесли первая часть пути была найдена не на его основании. Именно поэтому начинатьобход можно с любой клетки поля. Если же действовать строго исходя из правила Вансдорфа, маршрут должен начинаться в одной из четырех угловых клеток (так какиз них можно сделать наименьшее количество ходов).Правило Вансдорфа эффективно в подавляющем большинстве случаев.
Но не всегда.Иногда оно дает сбои. Дело в том, что вторая часть правила неверна. Если есть несколько клеток с одинаковым рейтингом, то имеет значение, в какую из них походить. Неверно выбранный путь приведет к тому, что решение не будет найдено. Впрочем, такойвариант на практике встречается весьма редко. Но что делать, если правило Вансдорфа все же даст сбой? В этом случае необходимо поменять последовательность векторов ходов в векторе step.
Смысл этого действия заключается в том, что при наличииклеток с одинаковым рейтингом ход делается именно в ту, которая соответствует верному маршруту. Всего вариантов организации ходов в иерархию 8!=40 320. Если запастись терпением, всегда можно найти такую последовательность ходов, при которой правило Вансдорфа будет работать безупречно.Глава 5.Комплексные числаОдним из крупных достоинств системы Mathcad является наличие полной поддержкиработы с комплексными числами в их традиционной форме представления (калькуляторы и электронные таблицы обычно рассматривают комплексные числа как пару действительных). Более того, комплексные числа — это основной тип чисел в Mathcad.Большинство математических операций программа по умолчанию проводит именно надкомплексными числами.
К примеру, при аналитическом и численном решении уравнений определяются как действительные, так и мнимые корни. Функция комплексногопеременного может быть легко проинтегрирована. Большинство встроенных функциймогут принимать как действительные, так и комплексные аргументы. Многие встроенные функции сами могут возвращать комплексные значения при определенных величинах аргументов. Например, логарифм отрицательного числа в Mathcad существует и равен соответствующему комплексному числу.Пример 5 . 1 . Комплексные числа в расчетах различных типовMathcad позволяет найти квадратный корень и логарифм отрицательного числа:-2 = 1.414iln(-10) = 2.303+ 3.142iПри аналитическом и численном решении уравнений могут быть получены комплексные корни.Аналитическое решение:2х + 1 = 0 solve,х —>Численное решение:х:=2 + iroot1,зфНПри проведении математических операций следует всегда помнить, что для большинства из нихимеют смысл и комплексные операнды.
Поэтому, получив, например, мнимое значение интеграла, не удивляйтесь, а тщательно проверьте правильность определения пределов.168Глава 5. Комплексные числаln(x)1 112. 22d x simplify —> -2-е + 2 - i - e + 2-е -тг- еln(x)dx= 7.062+ 3.297iПредельно внимательным нужно быть и в случае некоторых арифметических операций. Так, абсолютно идентичные с алгебраической точки зрения записи кубическогокорня из отрицательного числа, в виде степени 1/3 и специального значка, в Mathcadразличаются принципиально: в первом случае число рассматривается как комплексное, во втором — как действительное. В результате для их подсчета реализуются различные алгоритмы, что приводит к получению несхожих ответов.11[(-3) = -1.442(-3) 3 = 0.721- 1.249iБольшим достоинством Mathcad является то, что комплексное число может быть нетолько непосредственно получено при вычислениях, но и быть использовано в нихв качестве переменной или параметра. Эффективность расчета при этом совершенноне снизится.ln(3-i+l) = 1.151+ 1.249iesm— | = 1.426-0.45i8-x,-1-i+ edx —> -eВведение комплексного числа в Mathcad имеет некоторые особенности.• Проще всего можно ввести мнимую единицу, использовав соответствующую кнопку панели Calculator (Калькулятор).• Чтобы задать мнимую единицу с клавиатуры, нельзя просто нажать клавишу I, таккак при этом она будет воспринята системой как неизвестная переменная.
Для корректного задания мнимой единицы сначала введите цифру 1 и лишь затем i (ноне 1-i).)•В западной научной литературе иногда принято обозначать мнимую единицу не какi, а как j . В Mathcad имеется возможность замены символа мнимой единицы с помощью параметра Imaginary Value (Мнимая единица) на вкладке Display Options (Параметры отображения) окна Result Format (Формат результата), вызываемого изменю Format (Формат). Однако изменения, произведенные описанным параметром,коснутся лишь выражений ответа. Для задания же исходных данных с мнимым числом в виде буквы j нужно просто непосредственно ввести его с клавиатуры.Пример 5.2.