No Image

Вычисление корня функционального уравнения

371 просмотров
10 марта 2020

Раздел программы: “Научно-технические расчёты на ЭВМ”

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

Продолжительность занятия: 2 академических часа.

Тип урока: урок изучения нового материала.

Вид урока: комбинированный.

Время проведения: первый урок по теме “Приближенные вычисления”

Цели урока:

  • Развитие представлений о применениях ЭВМ для научно-технических расчетов.
  • Формирование системно-информационного подхода к анализу окружающего мира.
  • Формирование общеучебных и общенаучных навыков работы с информацией.

Задачи урока:

  • Воспитательная – развитие познавательного интереса, воспитание информационной культуры, воспитание умения четко организовать самостоятельную работу.
  • Образовательная – изучить и закрепить приемы использования языка программирования для решения задач приближенного решения уравнений, закрепить знания и умения по теме “Алгоритмизация и программирование”.
  • Развивающая – расширение кругозора.

Методы: Словесные, наглядные, практические.

Организационные формы работы: фронтальные, индивидуальные.

Материально-техническая база: доска, ПК с установленным ПО ЯП Turbo Pascal 7.0.

Межпредметная связь: математика.

Требования к знаниям и умениям: учащиеся должны знать основные команды языка программирования для задач вычислительного характера, уметь составлять и записывать алгоритмы с использование циклов и ветвлений; по записи алгоритма записывать программу на языке программирования Turbo Pascal.

Содержание этапа урока

Вид и формы работы

1. Организационный момент Приветствие 2. Мотивационное начало урока. Постановка цели урока. 3 Изучение нового материала.
Ознакомление с новым методом приближенного
решения уравнений,
показ образца действий. Работа в тетради. 4. Закрепление и проверка полученных знаний. Фронтальный опрос.

Работа в тетради по кодированию программ
по заданному алгоритму.

5. Упражнения творческого характера. Лабораторная работа:
применение созданной программы
для приближенного вычисления корня функции.
Работа в тетради.
Защита результатов. 6 Подведение итогов урока, домашнее задание. Работа в тетради.

I. Организационный момент

II. Мотивационное начало урока. Постановка цели урока

Учитель: Вычисления на компьютере обладают большей гибкостью, чем привычные всем вычисления в математике. Рассмотрим для примера задачу вычисления корня уравнения f(x) = 0. В курсе школьной математики вам известен метод дискриминанта для уравнений вида:
ax 2 + bx + c = 0, выражаемой по формуле . Однако, во многих случаях, ответ не выражается формулой (например, для корня уравнения cos(x) = x формулы просто нет). Но можно, не выводя точных формул, вычислить корень приближенно, с заданной точностью, например, до 0,0001. Сегодня мы рассмотрим один из приближенных методов вычисления корня уравнения – метод деления отрезка пополам.

III. Изучение нового материала.

Учитель: Рассмотрим задачу в следующей постановке.

Дано уравнение f(x) = 0 и числа a и b: a f(b) 0.

Если V–точный корень уравнения f(V) = 0, a * f(b) E, то перейти к пункту 1).

Любая точка отрезка [a, b] при таком алгоритме даст приближенное решение с заданной точностью.

Запишем алгоритм решения нашей задачи в виде блок схемы: (См. рис. 2).

Учитель: Есть ли вопросы?

Если у учащихся есть вопросы, то необходимо все уяснить, прежде чем переходить к следующему этапу урока/

Учитель: Какой алгоритм по структуре у нас получился?

ПО: циклический, причем использовать надо цикл с предусловием.

Учитель: Что необходимо вписать в блоки, помеченные звездочкой ( * )?

ПО: Здесь необходимо записать команду вычисления конкретной функции в точке a и в точке c.

Учитель: Что необходимо предварительно сделать, прежде чем применять этот алгоритм для нахождения корня уравнения?

ПО: Необходимо, в первую очередь, проверить, удовлетворяет ли функция постановке задачи: является ли график функции непрерывной линией на отрезке [a, b], разные ли знаки имеет функция на концах отрезка [a, b].

IV. Этап закрепления, проверки полученных знаний

Учитель: Можно ли применять метод деления отрезка пополам для нахождения корней уравнений, на заданных отрезках (уравнения записаны на доске):

  1. x 2 – 5 = 0, [0, 3] (ПО: функция непрерывна на отрезке и f(0) *f(3) 4 + cos(x) – 2 = 0 [0, 2] (ПО: функция непрерывна на отрезке и f(0)*f(2) 5 – 1 = 0 [–5, 2] (ПО: функция непрерывна на отрезке и f(– 5)*f(2) e do
    Begin c : = (a + b)/2;
    fc : = … ;
    If fc . fa 2 cos(2x) + 1 = 0 [0, /2]
  2. x 3 + x 2 + x + 1 = 0 [–2,1]
  3. x 5 – 0,3 | x – 1 | = 0 [0,1]
  4. 2xcos(x) = 0 [0, /4]
  5. tg(x) – (x + 1)/2 = 0 [0, /4]
Читайте также:  D link dir 412 прошивка

3. Это задание для учащихся математического класса: Вычислить значения , используя этот же метод деления отрезка пополам. Ответы сравните с расчетами на инженерном калькуляторе.
ВСЕ результаты вычислений фиксируются в тетради.

4. Результаты лабораторной работы должны быть защищены в индивидуальном порядке в беседе с учителем: проверяется понимание метода и используемой программы.

Вопросы для собеседования:

  1. В чем смысл переменной…?
  2. Что означает данная команда…?
  3. Как вы записывали для функции а) – е) выражение в команде fa : = .
  4. Для чего в программе используются операторные скобки?
  5. Для чего использовали в программе команду ветвления? Цикла?
  6. Где в программе осуществляется выбор отрезка, где находится корень уравнения?

На выполнение задания дается 30 минут. (Для выполнения задания учащиеся рассаживаются за компьютеры, загружают среду программирования и начинают проверять программу).

Защита результатов осуществляется по мере готовности учащихся, наиболее продвинутые учащиеся назначаются консультантами и принимают зачет вместе с учителем.

VI. Подведение итогов. Домашнее задание

Учитель: Подведем итоги. Сегодня на уроке вы узнали, как находить решение уравнений методом деления отрезка пополам, как использовать для этого компьютер. Я проверила во время практической работы и в процессе защиты результатов работы как вы усвоили материал, вы хорошо справились с заданием и получили следующие отметки… На этом изучение применений компьютера для научно-технических расчетов не заканчивается, предлагаю проанализировать свои записи в тетради и выполнить домашнее задание: подумать над вопросом “Какие методы поиска площадей фигур вы знаете?”. Запишите его себе в тетрадь.
Спасибо всем за работу.

При заданных пяти вариантах допустимой ошибки e заданным численным методом вычислить приближенное значение корня функционального уравнения вида f ( x ) = 0, если известно, что это уравнение имеет единственный корень на отрезке [ a , b ].

В работе должно быть предусмотрено:

проверка корректности введенных значений исходных данных (выполнение условия a e > 0),

перехват и обработка ошибки времени выполнения, когда строку введенных символов невозможно интерпретировать как число, построение графика функции в книге Excelle с помощью процедуры VBA .

Условие заданного численного метода соответствует третьему варианту:

F ( x ) = 3x – 4ln x –5 при х є [ 2; 4]

Вариант допустимой ошибки (при n =5):

1e–1; 1e–2; 1e–3; 1e–4; 1e–5; Заданным численным методом считать метод Ньютона, согласно варианту.

2 Описание заданного численного метода

Рисунок 1 поясняет метод Ньютона. Пусть имеется начальное приближение к корню, которое обозначим x n .

Рисунок 1 – Графическая иллюстрация метода Ньютона

Проведем касательную к графику y = f (x) в точке с координатами (x n , f (x n )) . Новое приближение к корню, которое мы будем называть следующим приближением, x s получим как точку пересечения этой касательной с осью абсцисс. Это правило приводит к следующей расчетной формуле:

При соблюдении некоторых условий (они называются условиями сходимости), которые будут перечислены ниже, строго доказывается, что приближение x s находится ближе к корню, чем приближение x n .

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

Сколько нужно выполнить итераций, чтобы нас могла устроить точность приближение x s к значению корня x *?

Обычно считают, что требуемая точность достигнута, если после вычисления x s при выполнении очередной итерации соблюдается условие

При выполнении неравенства (2) итерационный процесс уточнения корня следует прекратить и в качестве искомого приближенного значения корня взять

При выполнении первой итерации в качестве начального приближения x n можно взять любую точку отрезка [ a, b ], например его середину:

Читайте также:  Электроника 25ас 128 отзывы

Смысл условий сходимости метода Ньютона состоит в том, что начальное приближение x n , используемое при выполнении первой итерации, должно быть не слишком далеко от корня, а производная f ’ (x) должна изменяется на отрезке [ a, b ] не очень быстро и не обращаться в ноль ни в одной точке отрезка [ a, b ]. Мы будем считать, что они выполняются.

Метод Ньютона является наиболее быстрым среди численных методов вычисления корня функционального уравнения. На практике необходимая точность достигается буквально после выполнения нескольких (не более 10) итераций.

Формулы (1) – (4) должны быть применены в алгоритме вычисления корня по методу Ньютона. Для вычисления входящей в формулу (1) производной f ‘ (x) следует найти ее аналитическое выражение, применить в программе функцию для вычисления значения производной.

  1. Программа процедуры вычисления корня

На основе Блок-схемы была написана процедура Koren .

Private Sub koren(pred As Integer, a As Single, b As Single, eps As Single, xw As Single, it As Integer, Flag As Boolean)

Dim xn1 As Single, xn2 As Single, xs As Single

Dim fxn1 As Single, fxn2 As Single, fxs As Single

Dim d As Single, Bool As Boolean

fxn 1 = f ( xn 1) ‘ вызов функции f для расчета ее значения в точке xn 1

fxn 2 = f ( xn 2) ‘ вызов функции f для расчета ее значения в точке xn 2

xs = ( xn 1 + xn 2) / 2 ‘ вычисление xs

Bool = Sgn(fxs) = Sgn(fxn2)

‘ функция sgn () сравнивает значение арнумента с нулем

‘ если знак fxs и fxn 2 совпадают, то конец отрезка переносим в точку xs

‘ если знак fxs и fxn 2 не совпадают, то конец отрезка переносим в точку xs

Прежде чем перейти к изучению языка Haskell, разберем несколько примеров для более полного понимания различий между последовательным («императивным») стилем и функциональным стилем программирования. Для этого напишем решения задач на языке Java (все задачи несложные и не требуют глубокого знания языковых конструкций) в привычном императивном стиле и попробуем написать те же программы, используя функциональный стиль программирования.

Задача 1.1. Напишите программу для вычисления приближенного значения числа е по формуле для разложения е х в ряд Тейлора. Предложите программы на языке Java, написанные в традиционном императивном и функциональном стилях.

Решение. Данная задача является примером задачи вычисления значения по заданной функциональной зависимости, в данном случае, вычисления значения е х по заданному аргументу х. Фактически, поскольку вычисления осуществляются приближенно, необходимо ввести дополнительный аргумент, определяющий точность вычислений. Будем считать, что задано также вещественное значение eps, причем суммирование ряда Тейлора будет прекращено, когда очередной член ряда станет по абсолютной величине меньше eps. Тогда задача сводится к вычислению некоторой функции ех(х, eps). Программа, написанная на языке Java в традиционном стиле, может выглядеть так, как показано в листинге 1.4.

Листинг 1.4. Вычисление числа е в традиционном стиле public static double ex(double x, double eps) <

double ex = 0; // результат вычислений, исходная сумма = 0

double u = 1; // промежуточное значение члена ряда

int n = 1; // номер очередного члена ряда Тейлора

while (Math.abs(u) >= eps) <

// вычисление очередного члена ряда, суммирование ex += u;

return ex; // выдача результата работы

Для императивного стиля программирования характерно, что программа содержит повторяющиеся вычисления, записанные в виде цикла. Инвариантом цикла в данной программе служит тот факт, что переменная ех содержит частичную сумму ряда с (п-1) членом, а переменная и содержит значение очередного (следующего) члена этого ряда.

Для написания той же программы в функциональном стиле следует сначала написать функцию, определяющую зависимость е х от х и eps, явно. Такая зависимость может быть выражена с помощью рекуррентного соотношения, которое определяет способ вычисления частичных сумм ряда. Если уже имеется вычисленная частичная сумма ряда Sn и очередной член ряда Um то вычисления можно заканчивать, если значение Un меньше заданного eps. Если же это не так, то требуется добавить очередной член ряда к сумме, вычислить значение очередного члена ряда и вызвать ту же функцию рекурсивно.

Читайте также:  Как пользоваться плагинами в фотошопе

Значения частичной суммы Sn и очередного члена ряда Un также становятся аргументами нашей рекурсивной функции. Тогда набор функций, решающих задачу, может выглядеть, как показано в листинге 1.5.

Листинг 1.5. Вычисление числа е в функциональном стиле

/** Основная функция вычисления е в степени х.

* @param х показатель степени,

* @param eps точность вычислений.

* @return е в степени х с заданной точностью.

public static double ex (double x, double eps) <

// вычисление происходит с помощью вызова // вспомогательной рекурсивной функции, return exRec(x, eps, 0, 1, 1);

/** Вспомогательная рекурсивная функция,

* 0рагат х показатель степени,

* 0param eps точность вычислений,

* 0param sum накопленная частичная сумма ряда,

* 0param и очередной член ряда,

* 0рагат п номер следующего члена ряда.

* 0return сумма ряда с заданной точностью.

public static double exRec(

double x, double eps, double sum, double u, int n) < return Math.abs(u) Math.cos (x) — x, eps, 0, Math. PI / 2);

/** Функция приближенного вычисления корня функции f на

* заданном интервале (а, Ь) .

* Предполагается, что на этом интервале имеется ровно

* один корень, и на концах интервала функция принимает

* значения разных знаков.

* @param f Функция, корень которой мы ищем.

* брагат eps Точность вычислений – положительное число.

* брагат а Левый конец интервала, содержащего корень.

* брагат b Правый конец интервала, содержащего корень.

* бreturn Приближенное значение корня */

public static double root(Function f,

double eps, double a, double b) < double fa = f.apply (a); // значение функции на левом

// конце промежутка, double m, fm; // вспомогательные переменные.

// цикл последовательного деления промежутка, // содержащего корень функции, пополам, while (b — а > eps) <

m = (a + b) /2; fm = f.apply (m) ; if (Math.signum(fa) == Math.signum(fm)) <

// функция имеет значения одного знака // на концах интервала [а,ш] а = m; fa = fm;

/ / функция имеет значения одного знака // на концах интервала [m,b] b = т;

Если писать программу в чисто функциональном стиле, то цикл опять следует заменить рекурсией. Метод решения состоит в том, что на основе имеющихся данных об интервале, содержащем корень функции, строятся уточненные данные о таком интервале методом деления интервала пополам и выбора из двух половин той, которая содержит корень. В целом схема решения остается той же, только переменная fa становится еще одним аргументом рекурсивной функции. Функциональное решение задачи может иметь вид, как в листинге 1.7.

Листинг 1.7. Поиск корня функции методом бисекции в функциональном стиле

/** Функция приближенного вычисления корня уравнения

* cos х = х на интервале (0, pi/2) с заданной точностью.

* 0param eps Точность вычислений — положительное число.

* 0return Приближенное значение корня уравнения.

static double rootCos(double eps) <

final Function f = x -> Math.cos(x) return root(f, eps, 0, Math.PI / 2,

> /** Основная функция вычисления корня функции

* на заданном промежутке.

* 0param f Функция, корень которой ищем.

* 0param eps Точность нахождения корня.

* 0рагат а Левый конец промежутка.

* 0param b Правый конец промежутка.

* 0param fa Знак функции на левом конце промежутка.

* 0return Приближенное значение корня.

static double root (

double eps, double a, double b, double fa) < final double m = (a + b) / 2; final double fm = Math. signum (f. apply (m) ) ;

Комментировать
371 просмотров
Комментариев нет, будьте первым кто его оставит

Это интересно
Adblock
detector