c_cpp 【随机化算法】解非线性方程组【7.2.3】
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 【随机化算法】解非线性方程组【7.2.3】相关的知识,希望对你有一定的参考价值。
//随机化算法 解线性方程组
#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);
}
以上是关于c_cpp 【随机化算法】解非线性方程组【7.2.3】的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp 【随机化算法】线性时间选择算法【7.3.1】舍伍德(舍伍德)算法
c_cpp 【随机化算法】计算π值【7.2.1】
求Matlab大神给一个解下面这个非线性方程组的方法!!!!!!!!!!!!!
c_cpp 【随机化算法】随机数【7.1】
增广矩阵有未知数如何化简
如何使用拓展欧几里得算法求解模线性方程组(详解)