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;
}
}
}