在线急求迭代法C++求实根 谢谢了!
发布网友
发布时间:2024-10-06 13:17
我来回答
共1个回答
热心网友
时间:2024-11-29 07:37
1.
Newton法解非线形方程
还有Newton插值和迭代法解非线形方程,不知楼主要不要
#include <stdio.h>
#include <math.h>
#define F(X) X*X-2 //要解的方程
#define DF(X) 2.0*X //该方程的导数
static float VX[51],VY[51],VZ[51],VR[51];
static int MN= 51,RN=1;
static float EPS =1.0e-6;//精度
static float a=1.00,b=2,solution;//[a,b]解区间,
Operation()
{ int K;
float x;
if(F(a)>0) VX[0]=a;
else VX[0]=b;
VY[0]=F(VX[0]);
VZ[0]=DF(VX[0]);
VR[0]=b-a;
for(K=0;K<MN;K++)
{ x=VX[K]-VY[K]/VZ[K];
VX[K+1]=x;
VY[K+1]=F(x);
VZ[K+1]=DF(x);
VR[K+1]=fabs(VX[K+1]-VX[K]);
if(VR[K+1]<EPS) break;
}
RN=K+2;
return;
}
float P22_NTF(float e)
{ int k;
float eps=e;
float x0,x1,y,z;
if(F(a)>0) x0=a;
else x0=b;
for(k=0;k<100;k++)
{ y =F(x0);
z=DF(x0);
x1= x0-y/z;
if(fabs(x1-x0)<eps) break;
x0=x1;
}
return x1;
}
ShawResults()
{ int k;
printf("\n K X[K] Y[K] Z[K] R[K]");
printf("\n==================================================================");
for(k=0;k<RN;k++)
{ printf("\n%2d %15.8f%16.8e%16.8e%16.8e",k,VX[k],VY[k],VZ[k],VR[k]);}
printf("\n------------------------------------------------------------------");
printf("\n The Solution is %15.8f ,The EPS is %14.4e",solution,EPS);
printf("\n===================================================================");
getch();
return;
}
SaveResults()
{ FILE * fp;
int k;
fp=fopen("P22-NTF.htm","w");
if(!fp) return;
fprintf(fp,"<html><head></head>");
fprintf(fp,"<body bgcolor=#006699 text=#EEAA00>");
fprintf(fp,"<font size =\"6\"><pre>");
fprintf(fp,"\n K X[K] Y[K] Z[K] R[K]");
fprintf(fp,"\n==================================================================");
for(k=0;k<RN;k++)
{ fprintf(fp,"\n%2d %15.8f%16.8e%16.8e%16.8e",k,VX[k],VY[k],VZ[k],VR[k]);}
fprintf(fp,"\n------------------------------------------------------------------");
fprintf(fp,"\n The Solution is %15.8f ,The EPS is %14.4e",solution,EPS);
fprintf(fp,"\n===================================================================");
fprintf(fp,"</pre></font></body></html>");
fclose(fp);
return;
}
main()
{ Operation();
solution=P22_NTF(EPS);
ShawResults();
SaveResults();
}
2.
/*计算方法--牛顿切线法--yanfeng*/
/*书上第33页例题*/
/*注意:格式符%f默认输出小数点后6位数据,如果您要求的精度小于0.000001,
为保证数据正确输出,请修改源程序中格式符%m.nf的值*/
#include <stdio.h>
#include <math.h>
/*定义原函数,此函数必须满足使方程x=q(x)具有收敛性---22页定理*/
float f(float x)
{
float y;
y=(float)exp(x)*x-1;
return (y);
}
/*导数函数*/
float g(float x)
{
float y;
y=(float)exp(x)*(1+x);
return (y);
}
/*迭代函数*/
float s(float x)
{
float y;
y=x-(float)f(x)/g(x);
return (y);
}
/*迭代过程函数*/
void course(float X0,float e,int n)
{
float X1;
int k;
printf("迭代过程为:\n");
for(k=1;k<=n;k++)
{
if(g(X0)==0)
{
printf("Sorry,由于导函数的值为0,不能用牛顿切线法求解!\n");
break;
}
else
{
X1=s(X0);
printf("X%d=%f\n",k,X1);
if(fabs(X1-X0)<e)
{
printf("^_^,共迭代了%d次,所求方程的根X=%f\n",k,X1);
break;
}
else
{
if(k==n)
{
printf("Sorry,已达到最大迭代次数N,仍没有求出方程的根,\n可能是初值不合适或精度太高,请调整后再试!\n");
break;
}
else X0=X1;
}
}
}
}
void main()
{
float X0=0.5,e;
int n;
printf("牛顿切线法求方程的根\n\n");
printf("请输入所求实根的精度:e=");
scanf("%f",&e);
printf("请输入您所要求计算时的最大迭代次数N:n=");
scanf("%d",&n);
printf("\n");
course(X0,e,n);
}