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

📄 nt.cpp

📁 牛顿下山算法
💻 CPP
字号:
#include<iostream.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>

typedef struct{
	double xi;
	int ci;
}Equ ;

Equ E[20];

#define N 200
#define EPS 1e-6
#define ETA 1e-8

int k=0;

void main()
{
	double f(double);
	double f1(double);
	double x0,y0;
	double Newton(double (*)(double),double (*)(double),double);
	char a[100],xi[20][15],ci[20][5];
	int i=0,j;

	cout<<"Please input the Equation :"<<endl;
    cin>>a;
	cout<<a<<endl;
	
	while (i<100&&a[i]!='=')
	{
		j=0;
		while(a[i]!='x')  //找系数
		{
			xi[k][j]=a[i];
			j++;
			i++;
		}
       
			E[k].xi=atof(xi[k]);
		
		i+=2;        //转到次数;
		j=0;
		while(a[i]!='+'&&a[i]!='-'&&a[i]!='=')
		{
			ci[k][j]=a[i];
			j++;
			i++;
		}
		E[k].ci=atoi(ci[k]);     //获得次数
		
        k++;
		switch(a[i])
		{
		case 'x':
			i++;
			break;
		case '-':
			break;
		case '=':
            break;
		}
	}

	for(i=0;i<k;i++)
	{
		cout<<E[i].xi<<" , "<<E[i].ci<<endl;
	}


	cout<<"  inpou x(0)"<<endl;
	cin>>x0;
	cout<<"x(0) = "<<x0<<endl;
	y0=Newton(f,f1,x0);
	if(y0!=10000)
	{
		cout<<"The root is x = "<<y0<<endl;
	}
	getch();
	
}

double Newton(double (*f)(double),double (*f1)(double),double x0)
{
   	double x1,d;
	int g=0;
	do{                      //n牛顿法开始!
		x1=x0-f(x0)/f1(x0);
	//	cout<<x1<<"#";
		if((g++>N)||(fabs(f1(x1))<EPS))
		{
			cout<<"the Newton method fail !"<<endl;
			return 10000;
			break;//exit(1);
		}
		d=(fabs(x1)<1?x1-x0:(x1-x0)/x1);
	//	cout<<d<<"$";
		x0=x1;
		cout<<"x("<<g<<") = "<<x0<<endl;
	}
	while (fabs(d)>EPS&&fabs(f(x1))>ETA);
	return x1;
}

double f(double x)
{
	int i,j=0;
	double y=0,z=1;
	for(i=0;i<k;i++)
	{
		z=pow(x,E[i].ci);
		y+=z*E[i].xi;
	}
   //cout<<y<<"!";
	return y;
}

double f1(double x)
{
	Equ E1[20];
	int i,j=0;
	double z=1,y=0;

/*	for(i=0;i<k;i++)
	{
		cout<<E[i].xi<<" , "<<E[i].ci<<endl;
	}*/

	for(i=0;i<k;i++)
	{
		E1[i].xi=E[i].xi*E[i].ci;
		E1[i].ci=E[i].ci-1;
		if(E1[i].ci<0)
		{
			E1[i].xi=0;
		}
	//	cout<<E1[i].xi<<" , "<<E1[i].ci<<endl;
	}
    
/*	for(i=0;i<k;i++)
	{
		cout<<E1[i].xi<<" , "<<E1[i].ci<<endl;
	}
*/
    for(i=0;i<k;i++)
	{
		z=pow(x,E1[i].ci);
		y+=z*E1[i].xi;
	}
//	cout<<y<<"@";
	return y;
}

⌨️ 快捷键说明

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