1. 程式人生 > >Mathematica程式——計算函式對應影象所圍成的面積

Mathematica程式——計算函式對應影象所圍成的面積

 【問題】試求如下曲線所圍成圖形的面積。

x^2 + y^2 ≤ 16; x^2/36 + y^2  ≤ 1; (x - 2)^2 + (y+1) ≤ 9;

第一種演算法:

Area[x1_, x2_, y1_, y2_, step_] :=
Block[{nx, ny, i, j, xx, yy, s = 0},
    nx = IntegerPart[(x2 - x1)/step];
    ny = IntegerPart[(y2 - y1)/step];
    For[i = 1, i ≤ nx, i++,
      For[j = 1, j ≤ ny, j++, xx = x1 + i*step; yy = y1 + j*step;
        If[xx^2 + yy^2 ≤ 16 && xx^2/36 + yy^2 ≤ 1 && (xx - 
    2)^2 + (yy + 1)^2 ≤ 9, s = s + step^2]]];
    Return[s]]

【執行結果】
Area[-2, 6, -2, 2, 0.01]

8.8312

Area[-1, 4, -1, 1, 0.001]

8.83922

第一種方法的思想很簡單,就是細分矩形區域,將落在目標區域內的小矩形的面積進行累加

面積的近似程度與細分的精度step有關,演算法較為笨拙,計算時間長,演算法複雜度為O(1/step^2)。

第二種方法:基於概率思想的蒙特卡羅演算法的啟迪

AreaMC[x1_, x2_, y1_, y2_, n_] :=
Block[{rx, ry, i, s, calin = 0},
    For[i = 1, i ≤ n, i++,
      rx = Random[Real, {x1, x2}];
      ry = Random[Real, {y1, y2}];
      If[rx^2 + ry^2 ≤ 16 && rx^2/36 + 
      ry^2 ≤ 1 && (rx - 2)^2 + (ry + 1)^2 ≤ 9, calin = calin + 1]];
    s = (x2 - x1)*(y2 - y1)*N[calin/n];
    Return[s]]

AreaMC[-2, 6, -2, 2, 1000000]

8.85734

該演算法是近似演算法,演算法的複雜度依賴於隨機產生的點的個數n,複雜度為O(n)

相關推薦

Mathematica程式——計算函式對應影象面積

 【問題】試求如下曲線所圍成圖形的面積。 x^2 + y^2 ≤ 16; x^2/36 + y^2  ≤ 1; (x - 2)^2 + (y+1) ≤ 9; 第一種演算法: Area[x1_, x2_, y1_, y2_, step_] := Block[{nx, ny,

1359:面積------有錯誤,80'

#include<iostream> #include<cstdio> using namespace std; int flag[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int a[1000][1000]; int qu

HTML中在img使得src屬性為php程式(可為JPgraph產生的影象

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script type="text/javascript"> functio

編寫程式計算分段函式

#include <stdio.h> #include <math.h> #define PI 3.1415927 int main(){ double x,ans,tmp1,tmp2; while(scanf("%lf",&x)!=EO

作業系統中的fork()函式對應的程序建立過程

一、fork入門知識      一個程序,包括程式碼、資料和分配給程序的資源。fork()函式通過系統呼叫建立一個與原來程序幾乎完全相同的程序, 也就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事。  

給出圓的半徑為10,編一程式計算並輸出圓的周長和麵積

//順序流程及結構  #include"stdio.h"                        /*編

db2中left()函式和right()函式對應oracle中的substr()函式

DB2  LEFT、RIGHT函式  語法:LEFT(ARG,LENGTH)、RIGHT(ARG,LENGTH)  LEFT、RIGHT函式返回ARG最左邊、右邊的LENGTH個字串,ARG可以是CHAR或BINARY STRING。  eg:

opencv 平行計算函式 parallel_for_的使用

opencv 平行計算函式 parallel_for_ 前面的話 在使用opencv的過程中,對圖片的處理計算量還是很大的,所以在實施執行的程式中如何高效的計算會節省很多時間。現有的方法有很多,如OpenMp,TBB,OpenCL,當然還有Nvidia的CUDA。  但是OpenMP在wi

0005-用OpenCV的resize函式實現影象的縮放

影象縮放是什麼意思這裡不用說了吧! 在OpenCV中用resize函式實現影象的縮放,下面介紹這個函式!resize函式原型如下: C++: void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy

0024-利用OpenCV的filter2D函式影象的卷積操作和協相關操作

影象的卷積操作是影象處理中最常用的操作之一,一般是用核算子來實現卷積操作。什麼叫核算子?請移步博文https://blog.csdn.net/lehuoziyuan/article/details/84101788 OpenCV用函式filter2D來實現對影象或矩陣的卷積操作。這個函式本質上做

0019-用OpenCV的distanceTransform函式影象的距離變換

距離變換運算用於計算二值化影象中的每一個非零點距自己最近的零點的距離,距離變換影象上越亮的點,代表了這一點距離零點的距離越遠。距離變換通常用於細化字元的輪廓和查詢物體的質心(中心)。 OpenCV提供了distanceTransform函式用於計算二值化影象的距離變換。這個函式的原型如下: C++:

0030-用OpenCV的inpaint函式影象的汙點修復

OpenCV提供了inpaint函式做影象的汙點修復,它是基於畫素鄰域計算進行的修復,原型如下: C++: void inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int

給定一個正整數,編寫程式計算有多少對質數的和等於這個輸入的正整數,並輸出結果

1 public static void main(String[] args) { 2 Scanner sc = new Scanner(System.in); 3 while(true) { 4 System.out.print

nodejs + 小程式函式 生成小程式碼

前言:這個東西坑死我了 業務需求要生成小程式碼 然後我找了兩天的資料 執行 生成一堆的亂碼 死活就是不能生成 最後看了一遍部落格 套用了一下 自己又簡單的改了一下  nodejs 我是剛剛接觸  有很多都是不明白 request-promise  開始我用這個框架獲得“

C語言編寫程式計算圓上的點的座標

Problem Description There is a cycle with its center on the origin. Now give you a point on the cycle, you are to find out the other two points on i

微信小程式(3)函式呼叫,引數傳遞

<view class="m-view-cell" bindtap="bindStatus" data-type="全部">全部</view> <view class="m-view-cell" bindtap="bindStatus" data-type="待受理

10-5 遞迴計算函式ack(m, n)

// 10-5 // 遞迴計算函式ack(m, n) #include <stdio.h> int ack(int m, int n); int main(void) { int m, n; printf("請輸入m和n:"); scanf("%d%d", &m,

java程式計算兩個大整數相乘

方法1 :用兩個字串儲存輸入的大整數,然後用第二個字串的每一位去乘第一個字串的數字值,最後將每次的結果錯位相加即可。時間複雜度高O(n^2) 方法2:將兩個大整數X,Y每次分割成兩半,第一個分割成AB,第二個分割成CD。所以最後結果XY=(A*10^n/2 +B)(C*10^m/2+D);進

tensorflow相關tensor計算函式

1. tf.split 該函式主要用於對tensor進行分割,一般在設定多GPU平行計算時經常會被用到,主要是將一個batch資料集進行平分,分配給各個GPU,最後再彙總各個GPU得到的損失,從而加快模型的訓練速度,其主要引數的定義如下: value:待分割的 `Tensor

c++ 求sum(n!),n可以為極大的數 並程式計算執行時間

 此程式為用C++求1! + 2! + 3! +  …… + n! 其中n可以為極大的數,通常情況下double型只能存放1! + 2! + 3! + …… + 170!採用陣列的方法儲存資料可以做到算無窮大的數的階乘的和,期限制因素只在於程式中定義的陣列的大小。假如有比該