⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 laba_11.cpp

📁 Minimisation of scalar functions. Dichotomy method. A method of secants of parabolas. A golden sect
💻 CPP
字号:
#include <stdio.h>
#include <conio.h>
#include <math.h>

double eps=10e-4;
double tau=(sqrt(5)-1)/2.0;

void DIHOTOM(double,double);
void SEK_PARAB(double,double);
void GOLDEN_SECH(double,double);
double y(double,double,double,double);
double f(double);
double df(double);

void main()
{
    DIHOTOM(-2,3);
	SEK_PARAB(-2,3);
	GOLDEN_SECH(-2,3);
	getch();
}

double f(double x)
{
	return (exp(x)-exp(-x))*(exp(x)-exp(-x))/(exp(x)+exp(-x))/(exp(x)+exp(-x)) + x*x*x*x + x + 1/(x*x + 1);
}

void DIHOTOM(double x_a,double x_b)
{
	double a,b,c;
	double xmin,ymin,ydev;
	int counter=0;
	
	a=x_a;
	b=x_b;
	
	do
	{
		c=(a+b)/2;
		counter++;
		
		if(f(c-eps)<=f(c+eps))
			b=c+eps;
		else
			a=c-eps;
	}while((b-a)>=3*eps);
	
	xmin=(a+b)/2;
	ymin=f(xmin);
	ydev=(f(xmin+eps)-f(xmin))/eps;
	printf(" >> MeToD DuxoToMuu");
	printf("\n      Xmin = %2.2f \n      Ymin = %2.4f \n      counter = %d \n      Dev = %2.4f",xmin,ymin,counter,ydev);
}

double y(double x,double x0,double x1,double x2)
{
	return f(x0)+(f(x1)-f(x0))*(x-x0)/(x1-x0)+((f(x2)-f(x0))/((x2-x0)*(x2-x1))-(f(x1)-f(x0))/((x1-x0)*(x2-x1)))*(x-x0)*(x-x1);
}

void SEK_PARAB(double x_a,double x_b)
{
	double x0,x1,x2;
	int counter=0;
	double xmin,ymin,ydev;
	
	x0=x_a;
	x2=x_b;
	
	do
	{
		x1=(x0+x2)/2;
		counter++;
		
		if(y(x1-eps,x0,x1,x2)<=y(x1+eps,x0,x1,x2))
			x2=x1+eps;
		else
			x0=x1-eps;
	} while ((x2-x0)>=3*eps);
	
	xmin=(x0+x2)/2;
	ymin=y(xmin,x0,(x2+x0)/2,x2);
	ydev=(f(xmin+eps)-f(xmin))/eps;	
	ymin=f(xmin);
	printf("\n\n >> MeToD ceKyLL|ux IIapa6oJI");
	printf("\n      Xmin = %2.2f \n      Ymin = %2.4f \n      counter = %d \n      Dev = %2.4f",xmin,ymin,counter,ydev);
}

void GOLDEN_SECH(double x_a, double x_b)
{
	double x0,x1,x2,x3,F1,F2,ymin,ydev;
	double xmin=(x_a+x_b)/2.0;
 
	x0 = x_a;
	x3 = x_b;
	x1=x3-tau*(x3-x0);
	x2=x0+x3-x1;
	F1=f(x1);
	F2=f(x2);
	int counter=0;
	
	while ((x3-x0)>eps)
	{
		if (F1<=F2) 
		{
			x3=x2;
			x2=x1;
			x1=x0+x3-x2;
			F2=F1;
			F1=f(x1);
		}
		else 
		{
			x0=x1;
			x1=x2;
			x2=x0+x3-x1;
			F1=F2;
			F2=f(x2);
		}
		counter++;
	}

	if (f(((x0+x3)/2.0))<f(xmin)) 
		xmin=(x0+x3)/2;
	
	ymin = f(xmin);
	ydev = (f(xmin+eps)-f(xmin))/eps;
	printf("\n\n >> MeToD 3oJIoToro ce4eHu9I");
	printf("\n      Xmin = %2.2f \n      Ymin = %2.4f \n      counter = %d \n      Dev = %2.4f",xmin,ymin,counter,ydev);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -