Вычислительные методы
Автор: Ellik • Май 21, 2018 • Задача • 2,007 Слов (9 Страниц) • 412 Просмотры
МЕТОД ПОЛОВИННОГО ДЕЛЕНИЯ
#include <iostream>
#include <cmath>
using namespace std;
float f(float x) // functions mpd - "metod polovinnogo deleniya"
{
return 4 * x - 5;
}
int main()
{
double a, b, c, eps;
//Ввдоим данные
cout << "a: "; cin >> a; //Начало отрезка на котором рассматриваем
cout << "b: "; cin >> b; //Конец отрезка на котором рассматриваем
cout << "eps: "; cin >> eps; //Точность
while (fabs(b - a) > eps) //условие выхода из алгоритма
{
c = (a + b) / 2; // Вычисляем середину отрезка ab
if (f(b) * f(c) <= 0) //Тут мы проверяем знаки и поэтому тут умножение,тип должно быть одного знака
a = c; // Если это так то теперь начало нового отрезка, это середина старого
else
b = c; //Если знаки разыне, то конец отрезка приравниваем середине
}
cout << c << endl; //Вывод ответа
system("pause");
return 0;
}
Визуализация тут можно посмотреть https://www.youtube.com/watch?v=GhW6zk4abxc
МЕТОД КАСАТЕЛЬНЫХ
#include <iostream>
using namespace std;
double f(double x) //возвращает значение функции f(x) = x^2-2
{
return x*x - 2;
}
double f1(float x) //возвращает значение производной
{
return 2 * x;
}
double f2(float x) // возвращает значение второй производной
{
return 2;
}
int main()
{
setlocale(LC_ALL, "Rus");
//ввод данных
double a, b,c,eps;
cout << "a: "; cin >> a; //начало отрезка
cout << "b: "; cin >> b; //конец отрезка
cout << "eps: "; cin >> eps; //точность
if (f(a)*f(b) > 0) // если знаки функции на краях отрезка одинаковые, то здесь нет корня,график не проходит через абциссу(OX)
cout << "\nНет корней на данном интервале\n";
else {
if (f(a)*f2(a) > 0) // Выбираем с какой стороны будем проводить касательную,c конца или начала.
//Вторая производная функции отвечает за выпуклость или вогнутость графика функции, из за этого мы и проверяем.
//f2(x) > 0 , то график - вогнутый f2(x) < 0,то график - выпуклый
c = a;
else
c = b;
do {
c = c - f(c) / f1(c); // само уравнение касательной
} while (fabs(f(c)) >= eps); //выход из нашего алгоритма, пока не будет найдена заданная точность
cout << "x: " << c << endl; //вывод корня
}
system("pause");
Ее вопросы:
Вывести c = c - f(c) / f1(c);
Уравнение касательное имеет вид y=〖f(x_0 )+f〗^' (x_0 )(x-x_0)
y=0
0=〖f(x_0 )+f〗^' (x_0 )(x-x_0)
-〖f(x_0 )=f〗^' (x_0 )(x-x_0)
-〖f(x_0 )/(f^' (x_0 ) )=〗^ x-x_0
-〖f(x_0 )/(f^' (x_0 ) )=〗^ x-x_0
x_0-〖f(x_0 )/(f^' (x_0 ) )=〗^ x
x=x_0-〖f(x_0 )/(f^' (x_0 ) )〗^ где x_0 точка в которой ищем касательную, в коде x_0=c
Показать на графике эту c,
...