Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Решение нелинейных уравнений. Решение систем линейных уравненийСтр 1 из 5Следующая ⇒
ЧИСЛЕННЫЕ МЕТОДЫ РЕШЕНИЯ ЗАДАЧ Решение систем линейных уравнений
При численном решении систем линейных уравнений одним из распространенных является метод Гаусса, сущность которого сводится к поэтапному исключению неизвестных из уравнений. Ниже представлен пример решения системы методом Гаусса.
Этап 1. Исключение переменной
отсюда выражаем
подставим его во второе и третье уравнения:
отсюда систем имеет вид:
тогда переменная
Этап 2. Теперь исключим переменную
после подсчета коэффициентов получим:
отсюда выражаем
отсюда получаем систему:
Далее выполняем последовательно, начиная с третьего и заканчивая первым, вычисление каждой переменой с помощью данных уравнений:
После вычисления переменных, мы получили решение системы с помощью метода Гаусса. Общая методика метода Гаусса. Система представлена в общем виде как:
Процесс решения делится на два этапа: на первом последовательным исключением неизвестных составляется преобразованная эквивалентная система уравнений с треугольной матрицей, в которой все элементы под главной диагональю равны нулю. При этом одно из уравнений содержит только одну неизвестную, а в каждом следующем добавляется еще по одной переменной. На втором этапе решают преобразованную систему, последовательно определяя с помощью элементарных вычислений значения неизвестных. Рассмотрим этапы по шагам. Среди элементов Далее первое уравнение системы делят на
где Исключают неизвестную
где Над полученной системой повторяют вновь все операции до тех пор, пока не получат одно уравнение с одним неизвестным Объединяют все главные уравнения, в результате чего образуется система уравнений с треугольной матрицей, эквивалентной исходной:
После этого проводится обратный ход: из системы неизвестные
…
В случае вырожденной матрицы в процессе формирования системы уравнений будет получено значение Пример. Написать алгоритм и программу для решения системы линейных уравнений
Программа выполняется следующим образом: 1. Из файла com.dat считываем коэффициенты системы в массив для решения системы. Данные в файле даны в следующем виде: 2.3 4.5 3.1 8 0.2 2.2 5 1 4 -2 7.8 -5 2. Проводим вычисления с помощью процедуры gauss, выполняющую решение системы линейных уравнений методом Гаусса с выбором главного элемента. Для ее адекватной работы в процедуру следует передать переменные mas типа tablica (размеры задаются по потребности в разделе типов), в которой находятся коэффициенты системы линейных уравненений. Вторая целочисленная переменая cislo передает размерность системы (в нашем случае 3). После служебного слова var передаются переменные значения которых возвращает процедура, т.е. она изменяет их значения. В переменной X типа colonka (размеры должны соответствовать размерности системы и задаются в разделе определения типов) после выполнения процедуры будет находится решение системы линейных уравнений (по порядку будут находится значения переменных). Переменная flag_virogdena типа boolean показывает если она true, то система линейных уравнений является вырожденной, ели она false, то система линейных уравнений не вырождена. 3. После решения системы линейных уравнений с помощью процедуры gauss, выводим решения системы на экран.
uses crt; type tablica = array[0..2, 0..3] of real; colonka = array[0..2] of real;
var cislo: integer; temp: array[0..3] of real; znaki: array[0..2] of integer; f: text; A: tablica; X: colonka; flag: boolean; i, j: integer;
procedure gauss(mas: tablica; cislo: integer; var X: colonka; var flag_virogdena: boolean); var i, j, k, index, ind, znak: integer; sum, max: real; begin {начало процедуры} flag_virogdena: =false; for i: =0 to cislo-1 do znaki[i]: =i; for k: =1 to cislo-1 do begin max: =mas[k-1, k-1]; index: =k-1; ind: =k-1; for i: =k-1 to cislo-1 do for j: =k-1 to cislo-1 do if abs(mas[i, j])> abs(max) then begin max: =mas[i, j]; index: =i; ind: =j end; if max=0 then flag_virogdena: =true; if not(flag_virogdena) then begin for j: =k-1 to cislo-1 do begin temp[j]: =mas[index, j]; mas[index, j]: =mas[k-1, j]; mas[k-1, j]: =temp[j]; end; temp[cislo]: =mas[index, cislo]; mas[index, cislo]: =mas[k-1, cislo]; mas[k-1, cislo]: =temp[cislo]; for i: =0 to cislo-1 do begin temp[i]: =mas[i, ind]; mas[i, ind]: =mas[i, k-1]; mas[i, k-1]: =temp[i]; end; znak: =znaki[ind]; znaki[ind]: =znaki[k-1]; znaki[k-1]: =znak; for i: =k to cislo-1 do mas[k-1, i]: =mas[k-1, i]/mas[k-1, k-1]; mas[k-1, cislo]: =mas[k-1, cislo]/mas[k-1, k-1]; mas[k-1, k-1]: =1; for i: =k to cislo-1 do begin for j: =k to cislo-1 do mas[i, j]: =mas[i, j]-mas[i, k-1]*mas[k-1, j]; mas[i, cislo]: =mas[i, cislo]-mas[i, k-1]*mas[k-1, cislo]; mas[i, k-1]: =0; end; end; end; for i: =0 to cislo-1 do X[i]: =0; for k: =0 to cislo-1 do begin sum: =0; if (k=0) and (mas[cislo-1-k, cislo-1-k]=0) then flag_virogdena: =true; if (cislo-1-k)< cislo-1 then for j: =cislo-k to cislo-1 do sum: =sum-mas[cislo-1-k, j]*X[j]; if mas[cislo-1-k, cislo-1-k]=0 then X[cislo-1-k]: =0 else X[cislo-1-k]: =(mas[cislo-1-k, cislo]+sum)/mas[cislo-1-k, cislo-1-k]; end; for i: =0 to cislo-1 do temp[i]: =X[i]; for i: =0 to cislo-1 do X[znaki[i]]: =temp[i]; end; {конец программы} Begin{н.п} {программа для решения системы уравнений} assign(f, 'com.dat'); reset(f); for i: =0 to 2 do begin{н.б.1} for j: =0 to 3 do read(f, a[i, j]); {Ввод коэффициентов системы} readln(f); end; {к.б.1} gauss(a, 3, x, flag); {вычисление решения } for i: =0 to 2 do writeln('x', i+1, '=', x[i]: 7: 2); close(f); readln; End.{к.п.}
Результаты задачи 1: Файл com.dat: 2.3 4.5 3.1 8 0.2 2.2 5 1 4 -2 7.8 -5
x1=0.83 x2=1.77 x3=-0.61
Решение нелинейных уравнений Во многих инженерных рассчетах используются уравнения, которые не могут быть решены аналитически. В одномерном случае это уравнение вида:
где x- неизвестная величина; Для численного решения уравнения (4.2.1) одним из эффективных является метод дихотомии. Сущность этого метода состоит в поэтапном делении отрезка [a, b] попалам, на котором находится решение уравнения (4.2.1). На первом этапе табулируют функцию на отрезке
Из таблицы выделяют интервалы
Из рисунка видно, что на интервалах Метод дихотомии. Рассмотрим идеалогию метода дихотомии. Первоначально делят отрезок [a, b] на котором функция F(x) изменяет свой знак попалам, т.е. выбирают начальное приближение корня равным
Иллюстрация метода.
1-й шаг. Вычисление 2-й шаг. Вычисление 3-й шаг. Вычисление Подробная блок–схема алгоритма дихотомии представлена в примере данного подраздела. Метод Ньютона. Для использования данного метода F(x)-должна быть дифференцируема. Задается начальное значение переменной
Пример 1. Составить схему алгоритма метода Ньютона.
Обозначим в схеме
Пример 2. Написать алгоритм и программу решения нелинейного уравнения
Для вычисления пределов изменения корней протабулируем уравнение F(x)=0 на отрезке [-10, 4](выбор интервала произволен).
Из таблицы видно, что на отрезках [-10, -9] [-7, -6] [-4, -3] [0, 1] [2, 3] меняется знак функции, значит на этих отрезках есть корни уравнения. При состовлении программы метода дихотомии найдем решение уравнения на отрезке [0, 1].
График функции будет иметь вид:
Обозначим в схеме алгоритма выражения
program noline_eqution; {решение нелинейного уравнения} uses crt; var xn, xk, epsilon, x: real; flag_stop: boolean;
function fun(x: real): real; begin fun: =exp(x)-10*sin(x); end;
begin {н.п.} clrscr; xn: =0; xk: =1; epsilon: =0.005; flag_stop: =false; if fun(xn)*fun(xk)> 0 then writeln('Решения нет на данном отрезке') else begin while (abs(xk-xn)> 2*epsilon) and (not(flag_stop)) do begin x: =(xn+xk)/2; if fun(x)=0 then flag_stop: =true else if fun(xn)*fun(x)< 0 then xk: =x else xn: =x; writeln('x=', x: 5: 4, ’ xn=’, x0: 3: 2, ’ xk=’, xn: 3: 2); end; end; readln; end. {к.п.}
Результаты задачи 2: x=0.5000 xn=0.00 xk=0.50 x=0.2500 xn=0.00 xk=0.25 x=0.1250 xn=0.00 xk=0.13 x=0.0625 xn=0.06 xk=0.13 x=0.0938 xn=0.09 xk=0.13 x=0.1094 xn=0.11 xk=0.13 x=0.1172 xn=0.11 xk=0.12
|