Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №3 Вариант №8

.docx
Скачиваний:
8
Добавлен:
20.06.2014
Размер:
695.27 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ

Лабораторная работа №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) Метод секущих: