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

📄

📁 总结了所有常用的求方程的根的程序
💻
字号:
#include "stdio.h"
#include "math.h"
#define epsl (0.5*1e-2)
#define FUNC(x)  (pow((x),3)-8*(x)-40)
#define _DATA_FILE		"F:\\program\\result\\data.dat"

//对分法要用
double a=4.0,b=6.0;	
//小光法要用:
double Ma=(3*6*6-8);            //   Ma*max>0且|Ma|>=|max|;max为函数导数的最值
//迭代法要用
double x0=5.0;
//加速迭代法要用
double q=0.14;
//牛顿迭代法要用
#define FUNp(x)  (3*pow((x),2)-8)
//弦截法要用
double m=6.0,n=4.0;

//典型的对分法
void classicbisection(FILE *fp)
{
	fprintf(fp,"典型对分法\n");
	double x1,t1=a,t2=b;
	while(fabs(t2-t1)>epsl)
	{
		x1=(t1+t2)/2.0;
		if ( (FUNC(x1)*FUNC(t1))<0)
			t2=x1;
		else
			t1=x1;
		fprintf(fp,"%f\n",x1);
		if(FUNC(x1)==0)
			break;
	}
	fprintf(fp,"\n");
	
}
//改进型的对分法,适用于给定区间上的单调函数
//设计:诸葛小勇
//设计时间:2007-11-1,谑名"小光"法
//主要参考文献:王海涛、朱洪《改进的二分法查找》 
void advancedbisection(FILE *fp)
{
	fprintf(fp,"改进型的对分法\n");
	double x1,t1=a,t2=b;
	double temp1=0,temp2=0;
	while(fabs(t2-t1)>epsl&&temp1>=0&&temp2>=0)
	{
		temp1=-FUNC(t1)/Ma;temp2=FUNC(t2)/Ma;
		t1=t1+temp1;t2=t2-temp2;
		x1=(t1+t2)/2.0;
		if ( (FUNC(x1)*FUNC(t1))<0)
			t2=x1;
		else
			t1=x1;
		fprintf(fp,"%f\n",x1);
		if(FUNC(x1)==0)
			break;
	}
	fprintf(fp,"\n");	
}
//迭代法
void iterative(FILE *fp)
{
	fprintf(fp,"迭代法\n");
	double xi=x0,xip;
	fprintf(fp,"%f\n",xi);
	while(true)
	{		
		xip=pow((8*xi+40),(1.0/3.0));
		fprintf(fp,"%f\n",xip);
		if(fabs(xip-xi)<epsl)
			break;			
		xi=xip;	
	}
	fprintf(fp,"\n");	
}
//加速迭代法
void speedupiterative(FILE *fp)
{
	fprintf(fp,"加速迭代法\n");
	double xi=x0,xip;
	fprintf(fp,"%f\n",xi);
	while(true)
	{	
		xip=pow((8*xi+40),(1.0/3.0));
		xip=xip+(xip-xi)*q/(1-q);
		fprintf(fp,"%f\n",xip);
		if(fabs(xip-xi)<epsl)
			break;
		xi=xip;	
	}
	fprintf(fp,"\n");	
}
//埃特金加速法
void aitkenspeedup(FILE *fp)
{
	fprintf(fp,"埃特金加速法\n");
	double xi=x0,xip,xip1,xip2;
	fprintf(fp,"%f\n",xi);
	while(true)
	{
		
		xip1=pow((8*xi+40),(1.0/3.0));
		xip2=pow((8*xip1+40),(1.0/3.0));
		xip=(xip2*xi-xip1*xip1)/(xip2-2*xip1+xi);
		fprintf(fp,"%f\n",xip);
		if(fabs(xip-xi)<epsl)
			break;
		xi=xip;	
	}
	fprintf(fp,"\n");	
}
//牛顿迭代法
void newtoniterative(FILE *fp)
{
	fprintf(fp,"牛顿迭代法\n");
	double xi=x0,xip;
	fprintf(fp,"%f\n",xi);
	while(true)
	{		
		xip=xi-FUNC(xi)/FUNp(xi);
		fprintf(fp,"%f\n",xip);
		if(fabs(xip-xi)<epsl)
			break;			
		xi=xip;	
	}
	fprintf(fp,"\n");	
}
//单迭代点弦截法
void singlesecant(FILE *fp)
{
	fprintf(fp,"单迭代点弦截法\n");
	double xiq=m,xi=n,xip;
	fprintf(fp,"%f\n%f\n",xiq,xi);
	while(true)
	{		
		xip=xiq-FUNC(xiq)*(xi-xiq)/(FUNC(xi)-FUNC(xiq));
		fprintf(fp,"%f\n",xip);
		if(fabs(xip-xi)<epsl)
			break;			
		xi=xip;	
	}
	fprintf(fp,"\n");	
}
//双迭代点弦截法
void doublesecant(FILE *fp)
{
	fprintf(fp,"双迭代点弦截法\n");
	double xiq=n,xi=m,xip;
	fprintf(fp,"%f\n%f\n",xiq,xi);
	while(true)
	{		
		xip=xi-FUNC(xi)*(xi-xiq)/(FUNC(xi)-FUNC(xiq));
		fprintf(fp,"%f\n",xip);
		if(fabs(xip-xi)<epsl)
			break;			
		xiq=xi;	
		xi=xip;
	}
	fprintf(fp,"\n");	
}
void main()
{
	FILE *fp=fopen(_DATA_FILE,"w");
	classicbisection(fp);
	advancedbisection(fp);
	iterative(fp);
	speedupiterative(fp);
	aitkenspeedup(fp);
	newtoniterative(fp);
	singlesecant(fp);
	doublesecant(fp);
	fclose(fp);
}

⌨️ 快捷键说明

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