10.实现使用迭代法和加速迭代法求解非线性方程
#include "stdio.h"
#include "math.h"
/***********************************************************************/
/* 程序名:Equation1.C */
/* 程序功能:实现使用迭代法和加速迭代法求解非线性方程。 */
/* (需要构造迭代函数x=φ(x)的算法) */
/***********************************************************************/
float phi(float x)
/* ------------- */
/* 迭代函数 */
/* ------------- */
{
return pow(x*x+1,1.0/3);
}
void Iteration(float x0,float epsilon,int N)
/***********************************************************************/
/* 子函数名:Iteration */
/* 程序功能:实现使用迭代法求解非线性方程。 */
/* 输入: 初值x0, 误差精度tepsilon和最大迭代次数N. */
/* 输出: 迭代步骤和方程的近似解。 */
/***********************************************************************/
{
int n;
float x1;
printf("\n k x(k) ");
printf("\n %2d %f ",0,x0);
n=0;
do
{
x1=x0;
x0=phi(x1);
n=n+1;
printf("\n %2d %f ",n,x0);
} while(n<N && fabs(x1-x0)>=epsilon);
if(n<N) printf("\n\nResult=%f\n",x1);
else printf("\n\n%d次迭代后未达到精度要求.\n",N);
}
void RelaxationIteration(float x0,float epsilon,float omiga, int N)
/***********************************************************************/
/* 子函数名:RelaxationIteration */
/* 程序功能:实现使用松弛加速迭代法求解非线性方程. */
/* 输入: 初值x0, 误差精度tepsilon, 松弛因子omiga, 和最大迭代次数N.*/
/* 输出: 迭代步骤和方程的近似解. */
/***********************************************************************/
{
int n;
float x1;
printf("\n k x(k)^ x(k)");
printf("\n %2d %f ",0,x0);
x1=phi(x0);
n=1;
while(n<=N && fabs(x1-x0)>=epsilon)
{
x0=omiga*x1+(1-omiga)*x1;
printf("\n %2d %f %f",n,x1,x0);
x1=phi(x0);
n=n+1;
}
if(n<=N) printf("\n\nResult=%f\n",x1);
else printf("\n\n%d次迭代后未达到精度要求.\n",N);
}
void Aitken(float x0,float epsilon, int N)
/***********************************************************************/
/* 子函数名:Aitken */
/* 程序功能:实现使用迭代法求解非线性方程。 */
/* 输入: 初值x0, 误差精度tepsilon和最大迭代次数N. */
/* 输出: 迭代步骤和方程的近似解。 */
/***********************************************************************/
{
int n;
float x1,x2,xx;
printf("\n k x(k+1) x(k+2) x(k)");
printf("\n %2d %f ",0,x0);
n=0;
do
{
xx=x0;x1=phi(x0);x2=phi(x1);
x0=x2-(x2-x1)*(x2-x1)/(x2-2*x1+x0);
n=n+1;
printf("\n %2d %f %f %f",n,x1,x2,x0);
}while(n<N && fabs(xx-x0)>=epsilon);
if(n<N) printf("\n\nResult=%f\n",x1);
else printf("\n\n%d次迭代后未达到精度要求.\n",N);
}
main()
{
int N,i;
float x0,epsilon,omiga;
while(1) /* 可重复选择的菜单, 0 退出 */
{
i=100;
while(i>3 || i<0)
{
printf("\n\n---------------------------------------------\n");
printf(" NonLinear Equation: x=(x^2+1)^(1/3)\n");
printf("---------------------------------------------\n");
printf("1. Solve using Iteration.\n");
printf("2. Solve using Relaxation Iteration.\n");
printf("3. Solve using Aitken Iteration.\n");
printf("0. Quit.\n");
printf("\nPlease choice:");
scanf("%d",&i); /* 选择 */
}
switch(i)
{
case 1:
printf("\nx0=");
scanf("%f",&x0);
printf("\nEpsilon=:");
scanf("%f",&epsilon);
printf("\nN=");
scanf("%d",&N);
Iteration(x0,epsilon,N);
break;
case 2:
printf("\nx0=");
scanf("%f",&x0);
printf("\nEpsilon=:");
scanf("%f",&epsilon);
printf("\nOmiga=:");
scanf("%f",&omiga);
printf("\nN=");
scanf("%d",&N);
RelaxationIteration(x0,epsilon,omiga,N);
break;
case 3:
printf("\nx0=");
scanf("%f",&x0);
printf("\nEpsilon=:");
scanf("%f",&epsilon);
printf("\nN=");
scanf("%d",&N);
Aitken(x0,epsilon,N);
break;
case 0:
return;
}
}
}
11.实现使用二分法和Newton迭代法
#include "stdio.h"
#include "math.h"
/***********************************************************************/
/* 程序名:Equation1.C */
/* 程序功能:实现使用二分法和newton迭代法和弦截法求解非线性方程。 */
/* (直接使用函数f(x)的算法) */
/***********************************************************************/
float f(float x)
/* ------------- */
/* 原始函数 */
/* ------------- */
{
/*return x*x-6;*/
/*return x*exp(x)-1;*/
/*return sin(x)-x*x/4;*/
/*return x-cos(x);*/
return x*x*x-x-1;
}
float df(float x)
/* ------------- */
/* 原始函数 */
/* ------------- */
{
/*return 2*x;*/
/*return exp(x)*(x+1);*/
/*return cos(x)-x/2;*/
/*return 1+sin(x); */
return 3*x*x-1;
}
void Bisection(float a,float b,float epsilon,int N)
/***********************************************************************/
/* 子函数名:Bisection */
/* 程序功能:实现使用二分法求解非线性方程。 */
/* 输入: 初始区间[a,b], 误差精度tepsilon和最大迭代次数N. */
/* 输出: 二分步骤和方程的近似解。 */
/***********************************************************************/
{
int n;
float c,fa,fc;
printf("\n k a(k) b(k)");
printf("\n %2d %f %f",0,a,b);
fa=f(a);
if(fa*f(b)>0) printf("No Solution.");
else
{
n=0;
while(n<N && fabs(b-a)>=epsilon)
{
c=(a+b)/2;
fc=f(c);
if(fa*fc<0){b=c;}
else {a=c;fa=fc;}
n=n+1;
printf("\n %2d %f %f",n,a,b);
}
if(n<N) printf("\n\nResult=%f\n",(a+b)/2);
else printf("\n\n%d次迭代后未达到精度要求.\n",N);
}
}
void NewtonIteration(float x0,float epsilon,int N)
/***********************************************************************/
/* 子函数名:NewtonIteration */
/* 程序功能:实现使用Newton迭代法求解非线性方程. */
/* 输入: 初值x0, 误差精度tepsilon, 和最大迭代次数N. */
/* 输出: 迭代过程和方程的近似解. */
/***********************************************************************/
{
int n;
float x1;
printf("\n k x(k)");
printf("\n %2d %f ",0,x0);
n=0;
do
{
x1=x0;
x0=x1-f(x1)/df(x1);
n=n+1;
printf("\n %2d %f",n,x0);
}while(n<N && fabs(x1-x0)>=epsilon);
if(n<N) printf("\n\nResult=%f\n",x0);
else printf("\n\n%d次迭代后未达到精度要求.\n",N);
}
void NewtonDownHill(float x0,float epsilon,float epsilont, int N)
/*****************************************************************************/
/* 子函数名:NewtonDownHill */
/* 程序功能:实现使用Newton迭代法求解非线性方程. */
/* 输入: 初值x0, 误差精度tepsilon, 下山因子下界epsilont和最大迭代次数N. */
/* 输出: 迭代过程和方程的近似解. */
/*****************************************************************************/
{
int n;
float x1,y1,z1,t;
printf("\n k t x(k) f(x(k))");
printf("\n %2d %f %f %f",0,1.0,x0,f(x0));
n=0;
do
{
x1=x0;
y1=f(x1); z1=df(x1);t=1.0;