文档章节

【SICP练习】105 练习3.5-3.6

NoMasp
 NoMasp
发布于 2015/09/08 21:51
字数 723
阅读 3
收藏 0

练习3-5

原文

Exercise 3.5. Monte Carlo integration is a method of estimating definite integrals by means of Monte Carlo simulation. Consider computing the area of a region of space described by a predicate P(x, y) that is true for points (x, y) in the region and false for points not in the region. For example, the region contained within a circle of radius 3 centered at (5, 7) is described by the predicate that tests whether (x - 5)2 + (y - 7)2< 32. To estimate the area of the region described by such a predicate, begin by choosing a rectangle that contains the region. For example, a rectangle with diagonally opposite corners at (2, 4) and (8, 10) contains the circle above. The desired integral is the area of that portion of the rectangle that lies in the region. We can estimate the integral by picking, at random, points (x,y) that lie in the rectangle, and testing P(x, y) for each point to determine whether the point lies in the region. If we try this with many points, then the fraction of points that fall in the region should give an estimate of the proportion of the rectangle that lies in the region. Hence, multiplying this fraction by the area of the entire rectangle should produce an estimate of the integral.

Implement Monte Carlo integration as a procedure estimate-integral that takes as arguments a predicate P, upper and lower bounds x1, x2, y1, and y2 for the rectangle, and the number of trials to perform in order to produce the estimate. Your procedure should use the same monte-carlo procedure that was used above to estimate . Use your estimate-integral to produce an estimate of by measuring the area of a unit circle.

You will find it useful to have a procedure that returns a number chosen at random from a given range. The following random-in-range procedure implements this in terms of the random procedure used in section 1.2.6, which returns a nonnegative number less than its input.8

(define (random-in-range low high) (let ((range (- high low))) (+ low (random range))))

分析

蒙特卡罗法(Monte Carlo Method)求圆周率的原理:在长为1单位,面积为1平方单位的正方形中,以正方形的一个顶点作为圆心取1/4圆,面积为pi/4。在正方形内均匀的放入n个点,落在扇形(1/4圆)内的概率=扇形面积/正方形面积=pi/4。所以只要随机产生N个坐标(x,y),其中满足x^2+y^2<1的数据才有效。落在扇形中的次数乘以N再乘以4的数值在理论上接近于圆周率Pi。

然后我们再借用书中第155页底部的monte-carlo函数和题目中给出的random-in-range函数即可。(由于最终结果为浮点型,因此将random-in-range稍作修改更好)。

代码

(define (monte-carlo-pi trials) (define (monte-carlo trials experiment) (define (iter trials-remaining trials-passed) (cond ((= trials-remaining 0) (/ trials-passed trials)) ((experiment) (iter (- trials-remaining 1)(+ trials-passed 1))) (else (iter (- trials-ramaining 1) trials-passed)))) (iter trials 0)) (define (random-in-range low high) (let ((range (- high low))) (+ low (random (exact->inexact range))))) (define (estimate-integral p? x1 y1 x2 y2 trials) (* 4 (monte-carlo trials (lambda () (p? (random-in-range x1 x2) (random-in-range y1 y2)))))) (exact->inexact (estimate-integral (lambda (x y) (< (+ (square x) (square y)) 1.0)) -1.0 -1.0 1.0 1.0 trials)))



感谢访问,希望对您有所帮助。 欢迎关注或收藏、评论或点赞。


为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp


版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.csdn.net/nomasp

本文转载自:http://blog.csdn.net/nomasp/article/details/44202263

NoMasp
粉丝 7
博文 334
码字总数 0
作品 0
镇江
程序员
私信 提问
Ravi 0.18 发布,Lua 5.3 衍生编程语言

Ravi 编程语言是 Lua 5.3 的一个衍生,有限的可选静态类型,基于 LLVM 和 libgccjit 的 JIT 编译器。Ravi 的名字来自梵语的太阳。有趣的是,Lua 的前身是 Sol,它支持静态类型,Sol 是葡萄牙...

王练
2016/12/11
1K
2
自己搭建练习sql语句的环境~

突然想练习下sql语句,想在网上找个环境练习下找了半天既然没有。看到了一篇博文就以这篇博文为例子搭建个环境。(用到的工具打包)链接:http://pan.baidu.com/s/1nv8y8OD 密码:o5ls Navi...

skaiser
2017/06/19
0
0
MULE新手入门

对于新手来说,可能最需要的是先了解mule的基础知识和语法,这时,可以先看《MULE3.2节点详解.pdf》,了解mule的结构、常用参数获取方法、一些基础控件。 好了,现在已经对mule有了初步的了解...

yzbty23
2016/08/09
310
0
usermod命令用法、用户密码管理文件以及mkpasswd密码生成工具

9月20日任务 3.4 usermod命令 3.5 用户密码管理 3.6 mkpasswd命令 3.4 、usermod命令 # 更改用户属性命令 [root@zgxlinux-01 ~]# usermod -u 111 username # 更改用户属性[root@zgxlinux-01...

zgxlinux
2018/09/20
17
0
小巧高效的 HTTP 引擎--nxweb

nxweb 是采用 Python 和 C 编写的快速而且轻量级的 Web 服务器软件。 特性: 性能优异 可处理数千并发 内存占用小 事件驱动、多线程模型 代码量小 简单的 C API 体面的 HTTP 协议处理 支持 ...

dqzhangp
2015/11/25
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

从0开始学FreeRTOS-(列表&列表项)-6

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
32分钟前
4
0
Java的23种设计模式,详细讲解(一)

一、概述 设计模式是解决问题的方案,学习现有的设计模式可以做到经验复用。 拥有设计模式词汇,在沟通时就能用更少的词汇来讨论,并且不需要了解底层细节。 二、创建型 1. 单例(Singleton...

李红欧巴
48分钟前
5
0
android 使用asynctask结合fragment更新UI(另附线程池管理示例)

https://blog.csdn.net/qq_16064871/article/details/70767949

shzwork
48分钟前
3
0
SpringCloud实现分库分表模式下,数据库实时扩容方案

本文源码:GitHub·点这里 || GitEE·点这里 一、项目结构 1、工程结构 2、模块命名 shard-common-entity: 公共代码块shard-open-inte: 开放接口管理shard-eureka-7001: ...

知了一笑
49分钟前
5
0
js--时间切割装换工具类

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> /* * 修改data原型对象Format方法 ......

zhengzhixiang
59分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部