📄 nt.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 + -