Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шаблон лабы2.doc
Скачиваний:
3
Добавлен:
11.05.2015
Размер:
401.41 Кб
Скачать

3. Руководство оператора

5.1 Назначение программы

Программа предназначена для решения нелинейного уравнения с одним неизвестным.

5.2 Условия применения

Минимальные требования:

- Процессор Intel Pentium II.

- Наличие не менее 16Mб ОЗУ.

- Наличие не менее 1Мб свободного дискового пространства.

- SVGA – графический адаптер.

- Минимальный набор периферийного оборудования.

ПО, необходимое для функционирования программы:

- Операционная среда Windows 95/98/Me/2k/XP/Seven

5.3 Характеристики программы

Программа имеет консольный интерфейс.

Для выполнения программы требуется сравнительно небольшой промежуток времени.

5.4 Вызов и загрузка

Для начала работы программы необходимо запустить файл chisl_meth.exe

5.5 Данные

Входные данные:

1. Отрезок, на котором ищется решение.

2. Точность вычислений.

3. Начальное приближение.

Выходные данные:

1. Решение – точка x.

2. Значение функции в этой точке – f(x).

4. Текст программы

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <conio.h>

void kasat (void);

void sekush (void);

void dihotomiya (float a, float b, float eps);

void Quadr_interp(float a,float b,float eps );

void Enter_Info (float* eps, float* a, float* b);

void prostoi_iteracii (float x0, float eps);

void Steffensen (void);

void parabol (float a, float b, float eps);

#include "mod.h"

float f(float x)

{

return (x-4.0)*(x-4.0)- 1.0;

}

float d1 (float x)

{

return 2.0*x - 8;

}

float d2 (float x)

{

return 2.0 ;

}

float phi (float x) // для метода простой итерации

{

return sqrt (1-exp(x)/4.0);

}

float f_pi (float x)

{

return 4*(1-x*x)-exp(x);

}

void kasat (void) // метод касательных

{

float a, b, x0, x1, eps, temp;

printf ("Vvedite otrezok: ");

scanf ("%f%f", &a,&b);

printf ("Vvedite okrestnost: ");

scanf ("%f",&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);

printf ("y=%f\n", f(x0));

}

printf ("x*=%f",x0);

printf ("\ty=%f", f(x0));

}

void sekush (void) //метод секущих

{

float constant, temp, a, b, x, eps;

printf ("Vvedite otrezok: ");

scanf ("%f%f", &a,&b);

printf ("Vvedite okrestnost: ");

scanf ("%f",&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);

printf("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);

printf("y=%f\n", f(x));

}

while (fabs(temp)>eps);

}

printf ("x*=%f\t",x);

printf ("y=%f", f(x));

}

void dihotomiya (float a, float b, float eps)

{

int cnt=0;

float l,xn,x1,x2,fn,f1,f2;

xn=(a+b)/2;

l=b-a;

while (l>eps)

{

fn=f(xn);

x1=a+l/4;

f1=f(x1);

x2=b-l/4;

f2=f(x2);

if (f1<fn)

{

b=xn;

xn=x1;

}

else if(f2<fn)

{

a=xn;

xn=x2;

}

else

{

a=x1;

b=x2;

}

l=b-a;

cnt++;

}

printf("x*=%f\tf(x*)=%f\tcnt=%d", xn, fn, cnt);

}

void Quadr_interp(float a,float b,float eps )

{

float x1,x2,x3,x4,x5,x6,f1,f2,f3,f4,R,h, N;

h=(b-a)/5;

x2=(a+b)/2;

f2=f(x2);

x1=x2;

N=1;

while(N==1 && (x1-h)>=a)

{

x1=x1-h;

f1=f(x1);

if (f1>f2)

N=0;

}

if (N==1)

{

printf ("x1 not found, reduse a");

getch();

return;

}

N=1;

x3=x2;

while (N==1 && (x3+h)<=b)

{

x3=x3+h;

f3=f(x3);

if (f3>f2)

N=0;

}

if (N==1)

{

printf("x3 not found, increase b");

getch();

return;

}

do

{

N=N+1;

x5=(x3*x3-x2*x2)*f1+(x1*x1-x3*x3)*f2+(x2*x2-x1*x1)*f3;

x6=2*((x3-x2)*f1+(x1-x3)*f2+(x2-x1)*f3);

if (abs(x6)<eps)

R=0;

else

{

x4=x5/x6;

f4=f(x4);

R=d1(x4);

if (abs(R)<eps)

x2=x4;

else

{

if (f4<f2)

{

if (x4<x2)

{

x3=x2;

f3=f2;

}

else

{

x1=x4;

f1=f4;

}

x2=x4;

f2=f4;

}

else

{

if (x4>x2)

{

x3=x2;

f3=f2;

}

else

{

x1=x4;

f1=f4;

}

}

}

}

} while (abs(R)>eps);

printf ("x*=%f\tf(x*)=%f\tdf/dx=%f\tN=%f\tR=%f",x2,f(x2),d1(x2),N, R);

}

void Enter_Info (float* eps, float* a, float* b) //Ввод информации с клавиатуры

{

printf ("Enter [a;b]: ");

scanf ("%f%f", a,b);

while (*a>*b)

{

printf ("wrong info. try again:\n");

scanf ("%f%f", a,b);

}

printf ("enter eps: \n");

scanf ("%f", eps);

while (*eps<=0)

{

printf ("wrong info. try again:\n");

scanf ("%f", eps);

}

}

void prostoi_iteracii (float x0, float eps)

{

float x1;

do

{

printf ("\n x=%f, f(x)=%f", x0, f_pi(x0));

x1 = x0;

x0 = phi (x0);

} while ( abs(x1-x0) > eps);

printf ("\nroot of f(x)=0 is %f", x0);

}

void Steffensen (void)

{

float a, b, x0, x1, eps, temp;

printf ("Vvedite otrezok: ");

scanf ("%f%f", &a,&b);

printf ("Vvedite okrestnost: ");

scanf ("%f",&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)*f(temp)/( f(temp+f(temp))-f(temp) );

x1=temp;

printf ("x=%f\t",x0);

printf ("y=%f\n", f(x0));

}

printf ("x*=%f",x0);

printf ("\ty=%f", f(x0));

}

void parabol (float a, float b, float eps)

{

float x, x_last, opr1, opr2 ;

float x1 = a;

float x3 = b;

float x2 = (b+a) / 2 - (b-a)/4;

float y1 = f (x1);

float y2 = f (x2);

float y3 = f (x3);

opr1 = (x1*x1*y2 + x2*x2*y3 + x3*x3*y1)-(x3*x3*y2 + x2*x2*y1 + x1*x1*y3);

opr2 = (y1*x2 + y2*x3 + x1*y3) - (x2*y3 + x3*y1 + y2*x1);

x = -0.5 * (opr1/opr2);

if (x<x2)

{

x3 = x2;

x2 = x;

}

else

{

x1 = x2;

x2 = x;

}

do

{

printf ("\nx= %f, y= %f", x, f(x));

x_last = x;

y1 = f (x1);

y2 = f (x2);

y3 = f (x3);

x = -1/2* ((x1*x1*y2 + x2*x2*y3 + x3*x3*y1)-(x3*x3*y2 + x2*x2*y1 + x1*x1*y3))/( (y1*x2 + y2*x3 + x1*y3) - (x2*y3 + x3*y1 + y2*x1) );

if (x<x2)

x3 = x2;

x2 = x;

}

else

{

x1 = x2;

x2 = x;

}

} while (abs(x-x_last)>eps);

printf ("\nx= %f, y= %f", x, f(x));

}

#include "mod.h"

void main ()

{

float a, b, eps, x0;

int k;

while (1)

{

printf ("\n choose method: ");

printf ("\n1. kasatel'nyh\n2. sekush'ih\n3. dihotomiya\n4. quadratichnaya interpolyaciya\n5. prostoi iteracii\n6. Steffensen.\n7. parabol\n8. exit\n");

scanf ("%d", &k);

switch (k)

{

case 1:

kasat ();

break;

case 2:

sekush();

break;

case 3:

Enter_Info (&eps, &a, &b);

dihotomiya (a, b, eps);

break;

case 4:

Enter_Info (&eps, &a, &b);

Quadr_interp (a, b, eps);

break;

case 5:

printf ("\nenter x0 and eps: ");

scanf ("%f%f", &x0, &eps);

prostoi_iteracii (x0, eps);

break;

case 6:

Steffensen ();

break;

case 7:

Enter_Info (&eps, &a, &b);

parabol (a, b, eps);

break;

case 8:

return;

break;

default:

printf ("\nwrong choise!");

break;

}

}

}