otchyot_no6x

advertisement
МИНОБРНАУКИ РФ
Федеральное Государственное бюджетное
учреждение высшего профессионального образования.
Кафедра: Программная инженерия
Лабораторная работа №6
Вариант №2
Выполнил студент 2 курса
ПИН-1206 Волнухин Виктор
Проверил: Грязнов
Евгений Николаевич
Тверь 2013
Задание.
1. Выполните отделение корней уравнения, соответствующего вашему
варианту, любым методом:
1. x – sin(x) – 0.25 = 0
2. ln(x) – (x-5)2 = 0
3. sin(x-0.3) - x3 = 0
2. Выберете точку приближения и/или отрезок содержащий корень
уравнения.
3. Напишите программы для нахождения приближенного значения корня
уравнения на выбранном отрезке следующими методами:
a) методом дихотомии
b) методом Ньютона
c) методом секущих
+
Дополните лабораторную работу №4 реализацией следующих методов:
1. Метод простых итераций
2. Метод Стеффенсона
3. Метод Рыбакова
4. Для каждого метода составьте таблицу значений: номер шага,
приближенное значение корня, значение функции. Сравните
полученные приближенные значения с точным значением корня
функции на заданном отрезке. Сделайте выводы.
Теория:
Метод дихотомии:
Перед применением метода для поиска корней функции необходимо отделить корни
одним из известных способов, например, графическим методом. Отделение корней
необходимо в случае, если неизвестно на каком отрезке нужно искать корень.
Будем считать, что корень функции
отделён на отрезке
. Задача
заключается в том, чтобы найти и уточнить этот корень методом половинного деления.
Другими словами, требуется найти приближённое значение корня с заданной точностью
.
Пусть функция
непрерывна на отрезке
и
уравнения
,
- единственный корень
.
(Мы не рассматриваем случай, когда корней на отрезке
несколько, то есть более
одного. В качестве можно взять и другое достаточно малое положительное число,
например,
.)
Поделим отрезок
отрезка
.
пополам. Получим точку

Если
, то корень

Если нет, то из двух полученных отрезков
такой, что
найден (
).
, если

Новый отрезок
отрезка
и
надо выбрать один
, то есть
, если

и два
или
.
делим пополам. Получаем середину этого
и так далее.
Для того, чтобы найти приближённое значение корня с точностью до
необходимо остановить процесс половинного деления на таком шаге
котором
и вычислить
. Тогда можно взять
,
, на
.
Метод Ньютона
1.
Задается начальное приближение .
2.
Пока не выполнено условие остановки, в качестве которого можно
взять
или
(то есть погрешность в нужных
пределах), вычисляют новое приближение:
Метод секущих
.
.
Метод простой итерации — один из простейших численных
методов решения уравнений. Метод основан на принципе сжимающего
отображения, который применительно к численным методам в общем виде
также может называться методом простой итерации или методом
последовательных приближений[1]. В частности, для систем линейных
алгебраических уравнений существует аналогичный метод итерации.
Идея метода
Идея метода простой итерации состоит в том, чтобы уравнение
эквивалентному уравнению
привести к
,
так, чтобы отображение
было сжимающим. Если это удаётся, то последовательность
итераций
сходится. Такое преобразование можно делать разными способам.
В частности, сохраняет корни уравнение вида
если
является
на исследуемом отрезке. Оптимальным выбором
, что приводит к методу Ньютона, который является быстрым,
но требует вычисления производной. Если в качестве
выбрать константу того же
знака, что и производная в окрестности корня, то мы получаем простейший метод
итерации.
Метод Стеффенсена
В методе Ньютона необходимо на каждой итерации вычислять матрицу вторых производных.
Поэтому, когда вычисление матрицы вторых производных требует больших объемов вычислений,
трудоемкость каждой итерации значительно возрастает. Таким образом, требуется метод, который
может обойти эту проблему. Одним из таких методов является метод Стеффенсена, который
является разностным аналогом метода Ньютона. Матрица вторых производных заменяется
разностным отношением первых производных градиента по специальным узловым точкам.
Применим этот метод к решению следующей системы
уравнений:
задачи минимизации
, получим следующий итерационный метод решения
( 1)
.
Если приближение
так:
уже известно, то следующее приближение
определяется
( 2)
где \beta_k - числовой параметр,
производных, определяемая по правилу:
- матрица разделенных разностей первых
:
,
:
,
где
- элемент i-й строки j-го столбца матрицы
,а
, как и
выше, обозначает первые и, соответственно, вторые производные по переменным
функции J(u) (i,j=1,...,n). J(u) дважды непрерывно дифференцируема.
Решение нелинейных уравнений методом Рыбакова.
Для дальнейшего нам понадобится теорема Лагранжа. Приведем(напомним)
ее формулировку: Если функция f является непрерывной на замкнутом
отрезке [a,b] и существует конечная производная на открытом
отрезке(a,b),то обязательно найдется точка a<с<="" x,="" где="" f(x)="0."
Другими="" словами="" не="" “перепрыгнет”="" корень="" х="" и,=""
таким="" образом,="" последовательно="" будут="" найдены="" все=""
корни.="" Доказательство.="" Предположим="" число="" x="" является=""
корнем="" уравнения="" выполняется="" <x<="" xn+1,="" .="" ="" По=""
теореме="" Лагранжа="" такая="" точка="" с,="" a="" xn<с<с0, то отсюда
|f(xn)|/M<(x- xn) и окончательно получим x> xn+|f(xn)|/M =xn+1 .Таким
образом пришли к противоречию x> xn+1 с первоначальным
предположением xn <x< xn+1="" .
Построение функции 2 - ln(x) – (x-5)2
Код программы:
Основная часть:
private void button1_Click(object sender, EventArgs e)
{
try
{
double a = Convert.ToDouble(Text_a.Text);
double b = Convert.ToDouble(Text_b.Text);
int n = Convert.ToInt32(Text_n.Text);
double x = 0;
// Метод дихотомии
Methods Dihotomia_Integral = new Methods();
double f = Dihotomia_Integral.Method_Dihotomia(a, b, n, x);
label6.Text = f.ToString();
label9.Text = Dihotomia_Integral.Formula(f).ToString();
// Метод Ньютона
Methods Newton_Integral = new Methods();
double y = Newton_Integral.Method_of_Newton(a,n,x);
label7.Text = y.ToString();
label10.Text = Newton_Integral.Formula(y).ToString();
// Метод секущих
Methods Secant_Integral = new Methods();
double h = Secant_Integral.Method_of_secant(a,b,x,n);
label8.Text = h.ToString();
label11.Text = Secant_Integral.Formula(h).ToString();
// Метод простых итераций
Methods Simple_Iteration_Integral = new Methods();
double k =
Simple_Iteration_Integral.Method_of_simple_iteration(a, b, n);
label13.Text = k.ToString();
label14.Text =
Simple_Iteration_Integral.Formula(k).ToString();
// Метод Стеффенсона
Methods Steffeson_Integral = new Methods();
double g = Steffeson_Integral.Method_of_Steffenson(a, b, n);
label16.Text = g.ToString();
label17.Text = Steffeson_Integral.Formula(g).ToString();
// Метод Рыбакова
Methods Ribakov_Integral = new Methods();
double r = Ribakov_Integral.Method_of_Ribakov(a, b, n);
label19.Text = r.ToString();
label20.Text = Ribakov_Integral.Formula(r).ToString();
}
catch (Exception ex)
{
MessageBox.Show("Ошибка в строке ввода" + ex.ToString());
}
}
Класс, отвечающий за решение интеграла разными методами:
class Methods
{
public double Formula(double x) //формула
{
double y = Math.Log(x) - Math.Pow(x - 5.0, 2.0);
return y;
}
public double Formula_derivative(double x) //производная формулы
{
double y = 10.0 + (1.0 / x) - 2.0 * x;
return y;
}
public double max = new double();
public double Max_derivative(double h, double a, double b)
//нахождение максимальной производной
{
max = 0;
for (double i = a; i < b; i += h)
{
if (10.0 + (1.0 / a) - 2.0 * a > max)
max = 10.0 + (1.0 / a) - 2.0 * a;
}
return max;
}
// Метод дихотомии
public double Method_Dihotomia(double a, double b, int n, double x)
{
double ai, bi, c;
ai = a;
bi = b;
for (int i = 1; i <= n; i++)
{
c = (ai + bi) / 2;
if (Formula(c) == 0)
{
x = c;
//break;
}
if (Formula(ai) * Formula(c) < 0)
bi = c;
else
ai = c;
x = (ai + bi) / 2;
}
return x;
}
// Метод Ньютона
public double Method_of_Newton(double a, int n, double x)
{
x = a;
for (int i = 1; i <= n; i++)
{
x = x - Formula(x) / Formula_derivative(x);
}
return x;
}
//метод секущих
public double Method_of_secant(double a, double b, double x, int n)
{
double xprev,k;
xprev = a;
x = b;
for (int i = 0; i <= n - 1; i++)
{
k = x;
x = x - Formula(x) * (x - xprev) / (Formula(x) Formula(xprev));
xprev = k;
}
return x;
}
// Метод Итераций
public double Method_of_simple_iteration(double a, double b, double
h)
{
double x;
do
{
x = a - (Formula(a) * (b - a)) / (Formula(b) - Formula(a));
if (Formula(a) * Formula(x) < 0)
b = x;
else
a = x;
}
while ((Math.Abs(Formula(x))) >= h);
return x;
}
// Метод Стеффенсона
public double Method_of_Steffenson(double a, double b, double h)
{
double x1 = (a + b) / 2;
double x2 = x1 - (Formula(x1) * (Formula(x1) / (Formula(x1 +
Formula(x1)) - Formula(x1))));
while (Math.Abs(x2 - x1) > h)
{
x1 = x2;
x2 = x1 - (Formula(x1) * (Formula(x1) / (Formula(x1 +
Formula(x1)) - Formula(x1))));
}
return x2;
}
// Метод Рыбакова
public double Method_of_Ribakov(double a, double b, double h)
{
double x = 0;
double der;
Methods Method = new Methods();
der = Method.Max_derivative(h, a, b);
double c = ((Formula(a) - Formula(a + h)) / h) * (-1);
if (der >= c)
{
x = a;
x = x + (Math.Abs(Formula(x)) / der);
der = Method.Max_derivative(h, a, x);
while (Math.Abs(Formula(x)) > h)
{
a = x;
x = x + (Math.Abs(Formula(x)) / der);
if (x >= b)
{
break;
}
}
}
else
{
x = 0;
}
return x;
}
Пользовательский интерфейс:
Оглавление
Задание. .................................................................................................................................................... 2
Теория: ........................................................................................................................................3
Код программы: .........................................................................................................................6
Пользовательский интерфейс: ................................................................................................10
Download