Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Метод Ньютона для системы двух уравненийМОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ им. Н.Э. БАУМАНА
Отчет по лабораторной работе по курсу “Численные методы”
Решение систем нелинейных алгебраических уравнений методом Ньютона»
Выполнил: Студент группы РК6-43 Корчагина А.И.
Проверил: Доцент кафедры ФН-1 Храпов П.В.
Москва, 2011 Теоретическая часть Метод Ньютона для нелинейного уравнения
Для решения нелинейного уравнения f(x)=0 по методу Ньютона используется итерационный процесс:
где x(0) - некоторое начальное приближение к корню При этом предполагается, что f '(x) ≠ 0 на отрезке [ a,b ].
Геометрический вывод формулы. Геометрически итерационный процесс метода Ньютона означает замену на k -той итерации графика функции y=f(x) на касательную к этой функции в точке (x(k), f(x(k))) (в связи с этим метод также иногда называется методом касательных). Уравнение касательной имеет вид y=f '(x(k))(x-x(k))+f(x(k)) Найдем точку пересечения с осью OX этой касательной (вместо функции y=f(x)), что соответствует нахождению решения линейного уравнения: f '(x(k))(x-x(k))+ f(x(k))=0 вместо нелинейного f(x)=0. Выражая x, получаем: x = x(k) - f(x(k))/f '(x(k)) ≡ x(k+1) Аналитический вывод формулы. Рассмотрим уравнение f(x)=0, X - его корень, x(k) - k -ое приближение к корню. Тогда по теореме Лагранжа о средних значениях имеем: 0 = f(X) = f(x(k)) + (X - x(k))f '(ck), где ck ∈ (X, x(k)). Заменяя f '(ck) на значение f '(x(k)) (то есть используя предыдущее приближение к корню) приходим к приближенному равенству 0 ≈ f(x(k)) + (X - x(k))f '(x(k)). Откуда получаем X ≈ x(k) - f(x(k))/f '(x(k)) ≡ x(k+1)
Метод Ньютона для системы двух уравнений
Рассмотрим систему двух уравнений Алгоритм решения системы по методу Ньютона задается формулами:
где
(x1(0), x2(0)) - некоторое начальное приближение к корню. Реализация дифференцирования уравнений системы выполнена методом конечных разностей. где – элементарное приращение аргумента
Аналитическое решение
1) (a) 2) (б) Возведем (а) и (б) в квадрат: Ответ: Графическое решение Текст программы # include <iostream> # include <cmath>
using std::cout; using std::endl;
const double EPS = 1E-6; const double dx = 1E-5; const double dy = 1E-5;
inline double f1(double x, double y) { return 2.0 * x * x + x * y - y * y - 20.0; }
inline double f2(double x, double y) { return x * x - 4.0 * x * y + 7.0 * y * y - 13.0; }
int main(void) { double x[2] = { 3.5 * 10, 2.5 * 10 }; double xn[2] = { x[0], x[1] };
static unsigned count = 0;
cout.precision(12); cout << "i\tx\t\ty" << endl;
do { if (count > 0) { xn[0] = x[0]; xn[1] = x[1]; }
double f[2] = { f1(x[0], x[1]), f2(x[0], x[1]) };
double a = f1(x[0] + dx, x[1]) - f1(x[0], x[1]); a /= dx; double b = f1(x[0], x[1] + dy) - f1(x[0], x[1]); b /= dy; double c = f2(x[0] + dx, x[1]) - f2(x[0], x[1]); c /= dx; double d = f2(x[0], x[1] + dy) - f2(x[0], x[1]); d /= dy;
double df[2][2] = { { a, b }, { c, d } }; double det_df = a * d - b * c; double det_1 = 1.0 / det_df;
double df_inv[2][2] = { { d, -b }, { -c, a } };
x[0] = xn[0] - det_1 * (df_inv[0][0] * f[0] + df_inv[0][1] * f[1]); x[1] = xn[1] - det_1 * (df_inv[1][0] * f[0] + df_inv[1][1] * f[1]);
cout << ++count << '\t' << x[0] << '\t' << x[1] << endl;
getchar(); } while(fabs(x[0] - xn[0]) > EPS || fabs(x[1] - xn[1]) > EPS);
cout << "Num of iterations: " << count << endl << "Result:" << endl << "x = " << x[0] << endl << "y = " << x[1] << endl;
getchar(); return 0; } Результаты Newton's Method
|