1、随机落入点法(蒙特卡罗法)
下面程序是求x平方在0-1积分的小例子,原理就是向一个定积分规定的区域内随机投入无数点,统计投入在函数曲线与坐标轴之间的点数比总点数乘此块区域面积就是积分。针对复杂积分,需要扩展的地方还是很多的,例如,函数不单调(统计总区域面积就麻烦多了),函数跨越上下象限(需要对坐标求下绝对值就可以)。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace Jifen
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
double jieguo = jifen(0, 1, Convert.ToInt32(textBox1.Text));//求0到1的积分,textBox1.Text是投点个数,默认是999999就比较准确了
textBox2.Text = Convert.ToString(jieguo);
}
private double jifen(int x, int y, int count)
{
double a;
double b;
int fenzi=0;
Random rd = new Random();//随机对象
for (int i = 0; i < count; i++)
{
a = x+(y-x)*rd.NextDouble();//得到随机投入的横坐标
b = (y * y) * rd.NextDouble();//得到随机投入的纵坐标
if (b < a * a)//求x平方积分,这里判断投点是否在其函数曲线下面
fenzi++;//是的话计数
}
return (double)fenzi / count * (y - x) * (y * y);//落入函数曲线下面的点数比总点数乘此块区域面积就是积分
}
}
}