随机数法求解非线性方程组的解

求下列方程组的解:

x 2 + y 2 − 8 = 0 x^2 + y^2 - 8= 0 x2+y28=0
x − y = 0 x - y = 0 xy=0

运行结果:
可见与真实解 ( x = 2 , y = 2 ) (x = 2, y = 2) (x=2,y=2) ( x = − 2 , y = − 2 ) (x = -2, y = -2) (x=2,y=2)之一已经十分接近。实际上,通过修改代码可以把另一个解也求出来,此略。
在这里插入图片描述
思路:

构造目标函数 L = ( x 2 + y 2 − 8 ) 2 + ( x − y ) 2 L=(x^2 + y^2 - 8)^2 + (x - y)^2 L=(x2+y28)2+(xy)2, 显然当 L = 0 L = 0 L=0时的解,就是原方程组的解 。因此随机确定 x x x y y y,当 L L L 0 0 0十分接近时,此时的 x x x y y y就是方程组的近似解。

代码如下:

#include <iostream>
#include "Random.h"
#include <cmath>

#define MAX_V 100
using namespace std;

float L(float x, float y){
	float f1 = x * x + y * y - 8;
	float f2 = x - y;
	return f1 * f1 + f2 * f2;
}


int main(){

	Random rand;

	float x = 0;
	float y = 0;
	float l = L(x,y);
	while(l >= 0.01){
		float dir = rand.rand() * 2 * 3.14159;
		float len = rand.rand();   // 产生 [0, 1)的随机数
		float dx = len * cos(dir);
		float dy = len * sin(dir);
		float dl = L(x + dx, y + dy) - l;
		if(dl < 0){               //如果随机产生的x,y可以令目标函数变小
			x += dx;
			y += dy;
			l += dl;
		}
	}

	cout << "solve : x = " << x << " y = " << y << endl;
	return 0;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值