Лабораторная работа №3 Вариант №8
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ
Лабораторная работа №3
по дисциплине
«Технология программирования»
на тему:
«Программирование элементарных численных методов»
|
Студент |
|
|
|
|
|
|||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
|||||||||
|
Группа |
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|||||||||
|
Принял |
|
|
|
|
|
|||||||||
|
|
|
|
|
Домашнев П.А. |
|
|||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2011
1. Задание
Написать программу, осуществляющую поиск оптимального значения функции или решение уравнения заданным методом. Интервал поиска (или начальную точку – в зависимости от метода) вводит пользователь. На экране пользователю должен отображаться ход решения, т.е. все промежуточные точки и значения функции в этих точках. Начальные условия (функция, интервал/начальная точка) и ход поиска должны дублироваться в текстовый файл. Имя файла вводит пользователь.
Вариант 8
Алгоритм оптимизации: метод секущих, касательных.
Функция:
2. Блок - схема
Метод секущих Метод касательных
3. Текст программы
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
float f (float x)
{
return sin(x*x/10)*exp(x/10)/(x*x+1);
}
float d1 (float x)
{
return (exp(x/10)*((x*x-20*x+1)*sin(x*x/10)+2*(x*x*x+x)*cos(x*x/10)))/(10*(x*x+1)*(x*x+1));
}
float d2 (float x)
{
return (exp(x/10)*(4* (pow(x,5)-15 *pow(x,4)+2*pow(x,3)-10* x*x+x+5) *cos(x*x/10)-(4*pow(x,6)+7*pow(x,4)+40 *pow(x,3)-598*x*x+40* x+199)* sin(x*x/10)))/(100*pow((x*x+1),3));
}
void kos (void) // метод касательных
{
FILE* fp=fopen("result.txt", "w");
fprintf (fp,"y=sin(x*x/10)*exp(x/10)/(x*x+1)\n");
float a, b, x0, x1, eps, temp;
printf ("Vvedite otrezok, prinadlezhashego intervalu (-10;10): ");
scanf ("%f%f", &a,&b);
printf ("Vvedite okrestnost: ");
scanf ("%f",&eps);
fprintf (fp, "Otrezok: [%f, %f], eps=%f\n", a, b, eps);
if (f(a)*d2(a)>0)
{
x0=a;
x1=b;
}
else
{
x0=b;
x1=a;
}
while (fabs(x0-x1)>eps)
{
temp=x0;
x0=temp-f(temp)/d1(temp);
x1=temp;
printf ("x=%f\t",x0);
fprintf (fp,"x=%f\t",x0);
printf ("y=%f\n", f(x0));
fprintf (fp, "y=%f\n", f(x0));
}
printf ("x*=%f",x0);
fprintf (fp, "x*=%f",x0);
printf ("\ty=%f", f(x0));
fprintf (fp, "\ty=%f", f(x0));
fclose (fp);
getch();
}
void main (void) //метод секущих
{
FILE* fp=fopen("result.txt", "w");
fprintf (fp,"y=sin(x*x/10)*exp(x/10)/(x*x+1)\n");
float constant, temp, a, b, x, eps;
printf ("Vvedite conci otrezka, prinadlezhashego intervalu (-10;10): ");
scanf ("%f%f", &a,&b);
printf ("Vvedite okrestnost: ");
scanf ("%f",&eps);
fprintf (fp, "Otrezok: [%f, %f], eps=%f\n", a, b, eps);
if (d1(a)*d2(a)>0)
{
x=a;
constant=b;
do
{
temp=f(x)*(constant-x)/(f(constant)-f(x));
x=x-temp;
printf ("x=%f\t",x);
fprintf (fp, "x=%f\t",x);
printf("y=%f\n", f(x));
fprintf(fp, "y=%f\n", f(x));
}
while (fabs(temp)>eps);
}
else
{
x=b;
constant=a;
do
{
temp=f(x)*(x-constant)/(f(x)-f(constant));
x=x-temp;
printf ("x=%f\t",x);
fprintf (fp, "x=%f\t",x);
printf("y=%f\n", f(x));
fprintf(fp, "y=%f\n", f(x));
}
while (fabs(temp)>eps);
}
printf ("x*=%f\t",x);
fprintf (fp, "x*=%f\t",x);
printf ("y=%f\n", f(x));
fprintf(fp, "y=%f", f(x));
fclose(fp);
getch();
kos();
}
4. Пример выполнения
1) Метод касательных:
2) Метод секущих: