Курсовая работа по языку Visual C (Курсовая работа - Visual C)
Описание файла
Файл "Курсовая работа по языку Visual C" внутри архива находится в следующих папках: Какая-то работа по Си, informatica_kurs_03. Документ из архива "Курсовая работа - Visual C", который расположен в категории "". Всё это находится в предмете "информационные технологии" из 2 семестр, которые можно найти в файловом архиве РТУ МИРЭА. Не смотря на прямую связь этого архива с РТУ МИРЭА, его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информационные технологии" в общих файлах.
Онлайн просмотр документа "Курсовая работа по языку Visual C"
Текст из документа "Курсовая работа по языку Visual C"
Задание.
Вычислить методом Ньютона корень уравнения x * e ^ x = 1,215 + a с точностью до ε. a - параметр - абсцисса точки минимума функции f(x) = x ^ 4 + x ^ 2 + x - 1 на заданном отрезке [c;d].
В условии сказано, что с = -1, d = 1, ε = 1/1000.
Описание работы.
Для выполнения данной курсовой работы нам требуется использовать метод Ньютона, но для него также нужно одно условие: должна быть известна точка минимума функции f(x). Поэтому на моём пути стоит две задачи: нахождение точки минимума функции и работа с методом Ньютона.
Начну с метода минимизации. В учебниках алгебры описаны два известных метода: метод пассивного поиска и метод золотого сечения. С точки зрения скорости (и производительности программы) буду использовать второй метод (золотого сечения), так как он представляет собой простой перебор значений функции с некоторым шагом ε. Получается цикл вычислений на промежутке [c;d], делаемый (d - c) / ε раз. Метод золотого сечения удобен тем, что в процессе его выполнения на известном отрезке берутся дополнительные пробные точки (α, β), которые рассматриваются как новые границы данного отрезка. Это и придаёт методу золотого сечения бонус скорости, во много раз превосходящий метод пассивного поиска.
Способ нахождения пробных точек:
α = ρ + ( (3 - √5) * (d - c) / 2,
β = a + ( (√5 - 1) * (d - c) / 2.
Способ нахождения новых границ отрезка:
Если f(α) < f(β), то в качестве следующего приближения к искомому минимуму будет взято число α, а в качестве нового значения d будет взято число β (c - неизменно). В противном случае (f(α) ≥ f(β)) в качестве приближения к минимуму будет взято число β, а новым значением c будет взято число α (d - не изменяется).
Метод Ньютона представляет собой способ решения уравнения типа f (x) = 0. Для его применения требуется:
-
Непрерывность функции на отрезке [c;d];
-
Функция должна иметь производную в каждой точке этого отрезка.
За первичное приближение к искомому корню Х0 беру любую точку из отрезка
[c;d]. После через эту точку можно провести касательную, а в качестве нового приближения Х1 возьму точку пересечения этой касательной с осью Х. После повторения этой процедуры n раз получается последовательность приближений к искомому корню. Все эти значения находятся по формуле Xn = Xn - 1 - f(X n - 1) / f΄(Xn - 1). Вычисления должны быть прекращены, когда |f(Xn)| ≤ ε.
Однако эта рекуррентная формула в некоторых случаях расходится, вследствие этого когда f(Xn) * f΄΄( Xn) ≤ 0 (расхождение), то вычисления методом Ньютона следует прекратить.
Описание программы.
Программа представляет собой 1 файл Kurs1.cpp, разбита на 7 подпрограмм:
Void main() - главная подпрограмма, вызывающая нижеследующие и с помощью них исполняющая цель данной курсовой работы. Полученные результаты будут выведены на экран.
Double f(double x) - расчёт минимизированной функции для нахождения параметра a (f(x)=x^4 + x^2 +x -1; входной параметр - x.
Double f1(double x) - расчёт функции, задающей уравнение (f(x) = x* e^x - 1,215 - a); входной параметр - x.
Double proiz1(double x) - расчёт первой производной; входной параметр - x.
Double proiz2(double x) - расчёт второй производной; входной параметр - x.
Double metod(double a, double b, double eps) - минимизация методом золотого сечения; входные параметры - a, b - начальная и конечная границы отрезка, eps - заданная погрешность вычислений.
Double newton(double a, double b, double eps) - поиск корня уравнения методом Ньютона; входные параметры - a, b - начальная и конечная границы отрезка, eps - заданная погрешность вычислений.
#include <stdio.h>
#include <math.h>
#include <conio.h>
double abcissa;
// параметр а - абцисса
double f(double x);
// функция для нахождения параметра а
{
return x*x*x*x+x*x+x-1;
}
{double f1(double x);
// уравнение, которое требуется решить
return x*exp(x)-1,215-abcissa;
}
double proiz1(double x);
// расчёт первой производной
{
double h;
h=1e-6;
return (f1(x+h)-f1(x-h))/(2*h);
}
double proiz2(double x);
// расчёт второй производной
{
double h;
h=1e-6;
return (f1(x+h)-2*f1(x)+f1(x-h))/(h*h);
}
double metod(double a, double b, double eps);
// метод золотого сечения
{
double x, alp, bet, falp, fbet;
x=(f(a)<(f(b))?a:b;
alp=a+((3-sqrt(5))/2)*(b-a);
bet=a+((sqrt(5)-1)/2)*(b-a);
falp=f(alp);
fbet=f(bet);
while (fabs(b-a)>=eps)
{
alp=a+((3-sqrt(5))/2)*(b-a);
bet=a+((sqrt(5)-1)/2)*(b-a);
if(falp < fbet)
{
x=alp;
b=bet;
falp=f(alp);
}
else
{
x=bet;
a=alp;
fbet=f(bet);
}
}
return x;
}
double newton(double a, double b, double eps);
// метод Ньютона
{
double xn, xn1, an, bn;
xn=b;
an=a;
bn=b;
while (fabs(f1(xn)) > eps)
{
if (an*f1(xn)<0)
bn=xn;
else
an=xn;
if (f1(xn)*proiz2(xn)<0)
{
printf("\n STOPPED");
break;
}
xn1=xn;
xn=xn1-(f1(xn1)/proiz1(xn1));
}
return xn;
}
void main()
// главная подпрограмма
{
double c, d, eps, x;
eps=0.001;
c=-1;
d=1;
printf("\n KURSOVAYA RABOTA");
abcissa=metod(c,d,eps);
// находим абсциссу
printf("\n ABCISSA=%f",abcissa);
x=newton(c,d,eps);
printf("\n KOREN=%f\n",x);
getch();
}