数值随机化算法求非线性方程组

把线性方程组的各个方程的平方相加成一新的函数,从而转化为求此新函数的最小值。
方法在指定求根区域D内,选定一个随机点x0作为随机搜索的出发点。在
算法的搜索过程中,假设第j步随机搜索得 到的随机搜索点为xj。在第j+1步,首先计算出下一步的随机搜索方向r;然后计算搜索步长a。由此得到第j+1步的随机搜索增量Δxj。从当前点xj依Δxj得到第j+1步的随机搜索点。当Ф(xj+1)<ε时,取为所求非线性方程组的近似解。否则进行下一步新的随机搜索过程。
下面是一部分代码,哪位可以补充完整啊,非常急用?(计算机算法与设计 王晓东 书上的)谢谢
bool nonlinear(double *x0,double *dx0, double *x,double a0,
double epsilon, double k,int n, int steps,int m)
{ static randomnumber rad;
bool success;
double *dx, *r;
dx=new double[n+1];
r=new double[n+1];
int mm=0;
int j=0;
double a=a0;
for(int i=1;i<=n;i++)
{x[i]=x0[i];
dx[i]=dx0[i];
}
double fx=f(x,n);
double min=fx;
while ((min>epsilon)&&(j<steps))
{
if(fx<min)
{min=fx;
a*=k;
success=true;
}
else{mm++;
if (mm>m)a/=k;
success=false;}
for(int i=1;i<=n;i++)r[i]=2.0*rnd.fRandom()-1;
if(success)
for(int i=1;i<n;i++)dx[i]=a*r[i];
else
for (int i=1;i<n;i++)dx[i]=a*r[i]-dx[i];
for (int i=1;i<n;i++)x[i]+=dx[i];
fx=f(x,n);

}
if(fx<=epsilon)return ture;
else ruturn false;
}

参见博文:http://blog.csdn.net/liufeng_king/article/details/9029091
//随机化算法 解线性方程组
#include "stdafx.h"
#include "RandomNumber.h"
#include <iostream>
using namespace std;

bool NonLinear(double *x0,double *dx0,double *x,double a0,
double epsilon,double k,int n,int Steps,int M);
double f(double *x,int n);

int main()
{
double *x0, //根初值
*x, //根
*dx0, //增量初值
a0 = 0.0001, //步长
epsilon = 0.01, //精度
k = 1.1; //步长变参
int n = 2, //方程个数
Steps = 10000, //执行次数
M = 1000; //失败次数

x0 = new double[n+1];
dx0 = new double[n+1];
x = new double[n+1];

//根初值
x0[1] = 0.0;
x0[2] = 0.0;

//增量初值
dx0[1] = 0.01;
dx0[2] = 0.01;

cout<<"原方程组为:"<<endl;
cout<<"x1-x2=1"<<endl;
cout<<"x1+x2=3"<<endl;

cout<<"此方程租的根为:"<<endl;

bool flag = NonLinear(x0,dx0,x,a0,epsilon,k,n,Steps,M);
while(!flag)
{
flag = NonLinear(x0,dx0,x,a0,epsilon,k,n,Steps,M);
}
for(int i=1; i<=n; i++)
{
cout<<"x"<<i<<"="<<x[i]<<" ";
}
cout<<endl;

return 0;
}

//解非线性方程组的随机化算法
bool NonLinear(double *x0,double *dx0,double *x,double a0,
double epsilon,double k,int n,int Steps,int M)
{
static RandomNumber rnd;
bool success; //搜索成功标志
double *dx,*r;

dx = new double[n+1]; //步进增量向量
r = new double[n+1]; //搜索方向向量
int mm = 0; //当前搜索失败次数
int j = 0; //迭代次数
double a = a0; //步长因子

for(int i=1; i<=n; i++)
{
x[i] = x0[i];
dx[i] = dx0[i];
}

double fx = f(x,n); //计算目标函数值
double min = fx; //当前最优值

while(j<Steps)
{
//(1)计算随机搜索步长
if(fx<min)//搜索成功
{
min = fx;
a *= k;
success = true;
}
else//搜索失败
{
mm++;
if(mm>M)
{
a /= k;
}
success = false;
}

if(min<epsilon)
{
break;
}

//(2)计算随机搜索方向和增量
for(int i=1; i<=n; i++)
{
r[i] = 2.0 * rnd.fRandom()-1;
}

if(success)
{
for(int i=1; i<=n; i++)
{
dx[i] = a * r[i];
}
}
else
{
for(int i=1; i<=n; i++)
{
dx[i] = a * r[i] - dx[i];
}
}

//(3)计算随机搜索点
for(int i=1; i<=n; i++)
{
x[i] += dx[i];
}

//(4)计算目标函数值
fx = f(x,n);
j++;
}

if(fx<=epsilon)
{
return true;
}
else
{
return false;
}
}

double f(double *x,int n)
{
return (x[1]-x[2]-1)*(x[1]-x[2]-1)
+(x[1]+x[2]-3)*(x[1]+x[2]-3);
}
温馨提示:答案为网友推荐,仅供参考
相似回答