НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ
ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
им. Р. Е.Алексеева
Лабораторная работа
по вычислительной математике №1
Вар. 13
Выполнил:
Студент гр. 10-В-1
О.
Проверила:
С.
НИЖНИЙ НОВГОРОД
2012 г.
Задание:
Решить уравнение х^3-0,5* х^2+0,4*х-1,5=0 методом бисекций, хорд, касательных и методом итераций.
Теоретические сведения:
1. Метод деления отрезка пополам
1.1. Блок-схема метода:


1.2. Особенность:
Не требует предварительных расчетов
2. Метод Хорд
2.1. Блок-схема метода:


2.2. Особенность:
Не требует предварительных расчетов
3. Метод итераций
3.1. Блок-схема метода:
Приводим исходное уравнение к виду х = j(x)


3.2. Условия выбора начальной точки х0:
| j'(х0) |<1
3.3. Особенность:
Может не сходиться, большие предварительные вычисления.
4. Метод касательных
4.1. Блок-схема метода:


Исследование заданного уравнения

Анализируя график находим что корень должен быть примерно равен х≈1.2
Пояснение хода работы программы
1. Первая программа – bisek. cpp
Реализует метод деления отрезка пополам. Для работы программы требуется задать исходный отрезок, с помощью двух точек A и В, для дальнейшего поиска корня. Необходимым условием является то, что бы корень принадлежал данному отрезку. В контрольном примере отрезок задан в коде самой программы AB[1,1.8]. Программа выводит таблицу значений.
Внешний вид программы (контрольный пример):

2. Вторая программа – hord.cpp
Реализует метод хорд. Для работы программы требуется задать исходный отрезок, с помощью двух точек A и В, для дальнейшего поиска корня. Необходимым условием является то, что бы корень принадлежал данному отрезку. В контрольном примере отрезок задан в коде самой программы AB[1,1.8]. Программа выводит таблицу значений.
Внешний вид программы (контрольный пример):

3. Третья программа – iter. cpp
В программе реализован метод Итераций. Необходима начальная точка x0, которая запрашивается у пользователя в начале работы. Программа выводит таблицу значений, если составленный ряд не сходится(не выполняется условие по производной), программа сообщит об этом.
Внешний вид программы (контрольный пример):

4. Четвёртая программа – kas. cpp
Программа реализует метод касательных. Необходима начальная точка x0, которая запрашивается у пользователя в начале работы. Программа выводит таблицу значений.
Внешний вид программы (контрольный пример):

Вывод:
Применительно к заданному уравнению, можно сделать следующие выводы - метод касательных имеет большую область применения, по сравнению с методом итераций и остальными методами в этом уравнении; также он быстрее сходится к корню.
Приложение:
Листинг программы
bisec. cpp
#include <conio. h>
#include <stdio. h>
#include <stdlib. h>
#include <math. h>
double F(double x);
int main (void)
{
double A=1,B=1.8,C=0,E=0.0001;
clrscr();
printf(" A B C F(A) F(B) F(C)\n");
while ((fabs(F(C))>E)||(fabs((A+B)/2-C)>E))
{
printf(".");
C=(A+B)/2;
printf("%.4lf %.4lf %.4lf %.4lf %.4lf %.4lf\n",A, B,C, F(A),F(B),F(C));
if((F(A)*F(C))>0) A=C;
else B=C;
};
printf("\nX=%lf",C);
getch();
return 0;
}
double F(double x)
{
return x*x*x-0.5*x*x+0.4*x-1.5;
}
hord. cpp
#include <conio. h>
#include <stdio. h>
#include <stdlib. h>
#include <math. h>
double F(double x);
int main (void)
{
double A=1,B=1.8,C=0,E=0.0001;
clrscr();
printf(" A B C F(A) F(B) F(C)\n");
C=A-(B-A)/(F(B)-F(A))*F(A);
while (fabs(F(C))>E)
{
C=A-(B-A)/(F(B)-F(A))*F(A);
printf("%.4lf %.4lf %.4lf %.4lf %.4lf %.4lf\n",A, B,C, F(A),F(B),F(C));
if ((F(A)*F(C))>0) A=C;
else B=C;
};
printf("\nX=%lf",C);
getch();
return 0;
}
double F (double x)
{
return x*x*x-0.5*x*x+0.4*x-1.5;
}
iter. cpp
#include <conio. h>
#include <stdio. h>
#include <stdlib. h>
#include <math. h>
double F(double x);
double S(double x);
double S_(double x);
int main (void)
{
double E=0.0001,x0,x1;
clrscr();
do {
printf("\ninsert x0: |(F(x0)+x0)'|<1 ");
scanf("%lf",&x0);
printf("f'=%lf",S_(x0));
} while(fabs(S_(x0))>1);
printf("\nReshenie\n");
x1=x0;
do
{
x0=x1;
printf("x= %.4f ",x1);
printf("y= %.4f\n",S(x1));
x1=S(x0);
if(S_(x0)>1)
{printf("\nerr");break;}
}
while(fabs(x1-x0)>E);
printf("\nX=%lf\n",x0);
getch();
return 0;
}
double F(double x)
{
return x*x*x-0.5*x*x+0.4*x-1.5;
}
double S_(double x)
{
return (-3*x*x+x)/0.4;
}
double S(double x)
{
return (-x*x*x+0.5*x*x+1.5)/0.4;
}
kas. cpp
#include <conio. h>
#include <stdio. h>
#include <stdlib. h>
#include <math. h>
double F(double x);
double F_(double x);
int main (void)
{
double E=0.0001,x0,x1;
clrscr();
printf("insert x0: ");
scanf("%lf",&x0);
x1=x0-F(x0)/F_(x0);
while (fabs(x1-x0)>E)
{x0=x1;
x1=x0-F(x0)/F_(x0);
printf("\nX=%lf, F(X)=%lf",x1,F(x1));}
getch();
return 0;
}
double F(double x)
{
return x*x*x-0.5*x*x+0.4*x-1.5;
}
double F_(double x)
{
return 3*x*x-x+0.4;
}
Основные порталы (построено редакторами)
