- •Глава 7. Типы определяемые пользователем Структуры
- •Задания
- •Формирование структуры
- •7.2 Массивы структур
- •Глава 8 Файлы.
- •Примеры составления программ на языке с.
- •Задания.
- •Глава 9. Численные методы
- •9.1 Приближенные методы решения уравнений.
- •Метод половинного деления
- •Метод хорд.
- •Метод Ньютона.
- •Метод простой итерации.
- •Задания
- •9.2 Решение систем уравнений
- •9.3 Вычисление интегралов
- •9.4 Вычисление сумм числовых рядов Вычисление конечных сумм
- •Список литературы
- •456776, Г. Снежинск, ул. Комсомольская, 8
Метод хорд.
Метод деления пополам можно улучшить, если использовать для следующего вычисления не середину отрезка, а то значение x, в котором дает нуль линейная интерполяция между двумя известными значениями функции f(x). Геометрический способ интерполяции эквивалентен замене кривой y=f(x) хордой, проходящей через точку А(а,f(a)) и через точку B(b,f(b)).
Уравнение хорды: , где x0 точка пересечения с осью ОX.
Найдем точку пересечения хорды с осью ОХ:( х=с; y=0 ) координаты этой точки
c=a- (*)
Алгоритм метода хорд состоит из следующих шагов:
Вычислить f(a) и f(b).
Вычислить с по формуле с (*). Вычислить f(c)
Как только c-a< или b-c< закончить вычисление. За корень взять x=c.
Если f(c)*f(a)>0, то a=c и f(a)=f(c), иначе b=c и f(b)=f(c).
Выполнять с п.2.
Пример 9.2
Найти корни уравнения на интервале [0,2;1,5] = .
/**************************************************/
/* Приближенные методы решения уравнений. */
/* Метод хорд */
/**************************************************/
#include <stdio.h>
#include <math.h>
#include <conio.h>
void main( )
{
clrscr();
float a, b, eps;
float c, fa, fc,fb;
printf("\nВведите интервал[a,b] и точность eps\n");
printf("\n a="); scanf ("%f",&a);
printf("\n b="); scanf ("%f",&b);
printf("\n eps="); scanf ("%f",&eps);
printf("\nВведено a=%f\t b=%f \t eps=%f",a,b,eps);
fa=2*a-exp(-0.1*a);
fb=2*b-exp(-0.1*b);
if (fa!=0)
{
do
{
c=a-fa/(fb-fa)*(b-a);
fc=2*c-exp(-0.1*c);
if((c-a)<eps || (b-c)<eps )
{
printf ("\n Корень уравнения =%f",c);
break;
}
else
if (fa*fc>0)
{
a=c;
fa=fc;
}
else
{
b=c;
fb=fc;
}
} while (1);
}
getch();
}
Результаты работы программы.
Введите интервал[a,b] и точность eps
a=0.2
b=1.5
eps=0.0001
Введено a=0.200000 b=1.500000 eps=0.000100
Корень уравнения =0.476723
Метод хорд, как и метод деления пополам абсолютно надежен. В большинстве случаев он имеет более быструю сходимость, чем метод деления пополам. Однако основное достоинство метода деления пополам состоит в том, что скорость сходимости не зависит от вида функции f(x) и заранее известно, что будет в каждом конкретном случае, что нельзя сказать о методе хорд.
Метод Ньютона.
Если функция достаточно гладкая и имеет одну или более непрерывных производных, то можно применить и другие методы, позволяющие сократить число вычисляемых функций по сравнению с методом деления пополам.
В точке строят касательную. -точка пересечения. Далее снова строят касательную.
, где
Процесс продолжать до тех пор, пока |x -x |<.
Следовательно: .
Пример 9.3
Найти корни уравнения f(x)=sin(x)-x+0,15=0 на отрезке [0,5;1] =10 .
Запишем производную функции f(x):
f ’(x)=cos(x)-1
y=x-(sin(x)-x+0,15)/(cos(x)-1))
Выберем начальное приближение. Метод Ньютона обладает хорошей сходимостью, но основная трудность в методе Ньютона заключается в выборе начального приближения (x0), которое ведет к сходящемуся итерационному процессу. Начальное приближение целесообразно выбирать так, чтобы выполнялось условие:
f(x0)*f ’’(x0)>0
f ’’(x0)=-sin(x0)<0 (на заданном интервале). Значит необходимо, чтобы: f(x)=sin(x)-x*0,15<0.
Чтобы избежать процесса зацикливания программы, необходимо поставить ограничение на число итераций (повторов).
/************************************************/
/* Приближенные методы решения уравнений */
/* Метод Ньютона */
/************************************************/
#include <stdio.h>
#include <math.h>
#include <conio.h>
void main( )
{
clrscr();
int i, k=50; // k-ограничитель итераций.
float x, y, z, eps;
printf ("\n Начальное приближение:");
scanf ("%f",&x);
printf ("\n Точность:");
scanf ("%f",&eps);
printf ("\n x=%f и eps=%f", x, eps);
i=0; // i-счетчик итераций.
do
{
y=x-(sin(x)-x+0.15)/(cos(x)-1);
i++;
if (i>k) break;
z=x; // Сохраним предыдущее приближение.
x=y; // Новое приближение.
}
while (fabs(y-z)>eps);
if (i>=k)
printf ("\n Число итераций больше допустимого");
else
printf ("\n Корень равен=%f",x);
getch();
}
Результаты работы программы.
Начальное приближение:0.5
Точность:0.00001
x=0.500000 и eps=0.000010
Корень равен=0.981122