
- •1. Этапы подготовки и решения задач на эвм. Понятие алгоритма.
- •2. Элементарные базовые управляющие структуры
- •3. Состав и работа системы программирования Турбо Паскаль
- •4. Алфавит языка
- •5. Простейшие конструкции и типы данных
- •6. Структура программ на Паскале
- •7. Ввод и вывод данных
- •8. Программирование линейных структур в Паскале
- •Var b,y,z: real;
- •Var day: integer;
- •Var X,y: real; к: integer;
- •11. Программирование циклов с неизвестным числом повторений
- •Var X: integer;
- •Var X,a,p: real; k:integer;
- •12. Программирование вложенных циклов. Массивы.
- •Var amin:real; I, j : integer; a:array[1..100] of real;
- •13. Процедуры и функции в Паскале
- •Var a,b,c,s1,s2,s3,k,r,z:real;
- •Var c,n,m,l: integer;
- •Var p,I: integer;
- •14. Записи в Паскале.
- •15. Работа с файлами в Паскале
- •I:byte;
- •16. Программирование в графическом режиме
- •17. Анимация изображений в Паскале
- •X,y,dy,dx,time,delta,radius,Gd,Gm: integer;
- •18. Построение графика аналитически заданной функции
- •Xn, xk, X, y, Ymin, Ymax, dx:real;
- •19. Численные методы вычисления определённого интеграла
- •I, n: integer;
- •20. Численные методы решения нелинейных уравнений. Общие принципы.
- •22. Численные методы решения нелинейных уравнений. Метод Ньютона (метод касательных).
- •23. Численные методы решения нелинейных уравнений. Метод хорд (метод ложного положения).
- •24. Численные методы решения обыкновенных дифференциальных уравнений. Общие принципы.
- •25. Численные методы решения обыкновенных дифференциальных уравнений. Метод Эйлера.
- •Xn,xk,yn,h,X,y:real;
- •I:integer;
- •26. Численные методы решения обыкновенных дифференциальных уравнений. Модифицированный метод Эйлера.
- •Xn,xk,yn,yw,h:real;
- •I,n:integer;
- •X,y:array [1..20] of real;
- •27. Численные методы решения обыкновенных дифференциальных уравнений. Метод Рунге-Кутта.
- •Xn,xk,yn,h,k0,k1,k2,k3:real;
- •I,n:integer;
- •X,y:array [1..20] of real;
20. Численные методы решения нелинейных уравнений. Общие принципы.
При решении инженерных задач встречаются алгебраические и трансцендентные уравнения, решение которых может представлять собой самостоятельную задачу или быть составной частью более сложных задач. В обоих случаях применение численного метода позволяет быстро и эффективно добиться решения задачи.
Алгебраические уравнения имеют n решений, трансцендентные – неопределённое число решений. Уравнения, содержащие только суммы целых степеней x, называются алгебраическими. Их общий вид
anxn+an-1xn-1+...+a1x+a0=0
Нелинейные уравнения, содержащие тригонометрические функции или другие специальные функции, например, exp, называются трансцендентными.
Если отсутствует аналитическое решение нелинейного уравнения или оно очень сложно, применяют численные методы, в которых, как правило, применяются итерационные алгоритмы. В итерационных методах задаётся процедура решения в виде многократного применения некоторого алгоритма. Полученное решение всегда является приближённым, хотя может быть сколь угодно близким к точному.
Пусть на отрезке [a,b] дана непрерывная функция y=f(x), причем значения f(a) и f(b) имеют разные знаки. Тогда абсцисса точки пересечения графика функции y=f(x) с осью X будет корнем уравнения f(x)=0. Другими словами, требуется найти такое значение x, при котором значение функции f(x) будет равно нулю.
Численными методами значение корня определяется с погрешностью, не превосходящей данного положительного, достаточно малого числа ε. Иначе говоря, если v – истинное значение корня, при котором f(v)=0, то требуется определить такое число w, при котором a=<ε.
Первый этап решения состоит в отыскании области существования корня, т.е. отрезков на оси абсцисс, в концах которых функция имеет разные знаки. Для этого вычисляются значения функции в точках, расположенных через равные интервалы на оси x. Это делается до тех пор, пока не будут найдены два последовательных значения функции f(xn) и f(xn+1), имеющих противоположные знаки, т.е. f(xn)*f(n+1)<0. Таким образом, при a= xn, b=n+1, уточнение корней будет производиться на отрезке [a,b]. Для решения этой задачи применяются методы половинного деления, касательных (Ньютона), хорд и секущих.
21. Численные методы решения нелинейных уравнений. Метод половинного деления. Алгоритм метода состоит из следующих операций. Отрезок [a,b] делят пополам точкой c, c=(a+b)/2, и находят значение функции в точке с. Если f(c)=0, то корень уравнения соответствует точке c. Если f(c)≠0, то можно сузить диапазон поиска корня: перейти от отрезка [a,b] к отрезку [a,c] или [c,b] в зависимости от знака f(c). Если f(a)*f(c)<0, то корень находится на отрезке [a,c], и точку с будем считать точкой b; а если f(a)*f(c)>0, то корень находится на отрезке [c,b], и точку с будем считать точкой a. Каждый такой шаг уменьшает в два раза интервал, в котором находится корень уравнения f(x)=0. После нескольких шагов получится отрезок, длина которого будет меньше или равна числу ε, т.е. |a-b|=<ε. Любая точка такого отрезка, например, один из его концов, подходит в качестве решения поставленной задачи. На рисунке показано несколько этапов применения алгоритма. Здесь 1…5 – интервалы уточнения корней на 1..5 шаге алгоритма. Пример: Найти с точностью ε=0,001 на отрезке [-2,1] корень уравнения x3+x2+x+1=0. Приведём текст программы, которая решает эту задачу методом половинного деления. Результат выводится на экран, и, по желанию пользователя, на принтер. Program Popolam; Uses Crt, Printer; Var a,b,c,eps,a0,b0:real; k:integer; ch:char;
Function f(x:real):real; begin {Здесь приводим выражение для вычисления функции } f:=x*x*x+x*x+x+1; end;
Begin ClrScr; Writeln(' Решение уравнения методом половинного деления '); { Ввод исходных данных } a:=-2; b:=1; eps:=0.001; a0:=a; b0:=b; { запоминаем исходные данные } { Начинаем расчет } k:=0; { Счетчик повторений } While abs(b-a)>=eps do begin k:=k+1; c:=(a+b)/2; if f(a)*f(c)<=0 then b:=c else a:=c; end; Writeln(' Уравнение x^3+x^2+x+1=0 на отрезке [',a0:4:1, ',', b0:4:1, '] имеет корень x = ', c:10:8); Writeln(' f(x) = ',f(c):10:8); Writeln('Точность ',eps:10:8, ' достигнута за ', k,' итераций'); Write(' Печатать результаты на принтере? (Y/N)'); Repeat ch:=ReadKey; ch:= UpCase(ch); Until (ch='Y') or (ch='N'); if ch='Y' then begin Writeln(lst,'Решение уравнения методом половинного деления'); Writeln(lst,' Уравнение x^3+x^2+x+1=0 на отрезке [', a0:4:1, ',', b0:4:1, '] имеет корень x = ', c:10:8); Writeln(lst,' f(x) = ',f(c):10:8); Writeln(lst,' Точность ',eps:10:8, ' достигнута за ', k,' итераций'); Writeln('Печать выполнена. Нажмите ENTER '); Readln; end; End. |
|