06 函数、匿名函数、脚本

6.1 函数

函数格式:

 function [输出参数] = myfun(输入参数)
     函数体;
 end
  1. 圆的面积函数

     **function s = area(r) s = pi * r.^2; end**
    

    函数的调用,在函数的上面调用

     **ans = area(2); ans = area([1,2])**
    
  2. 圆的周长

     **function c = len(r) c = 2*pi.^r; end**
    

    函数的调用,在函数的上面调用

     **c = len(1); c = len([1,2])**
    
  3. 同时计算周长和面积

     **function [s, c] = areaAndLen(r, PI) s = pi * r.^2; c = 2*pi.^r; end**
    

    函数的调用,在函数的上面调用

     **[s, c] = areaAndLen(1, 3.14)**
    

6.2 匿名函数

  1. 匿名函数的定义

     **f = @(输入参数) 函数体 f: 函数句柄**
    
  2. 定义一个取平方的函数

    **f = @(x)x.^2;f(2);**
    
  3. 有两个参数的函数

    **f1 = @(x, y)a.^2 + y.^2 +2*x.*y;f1(2, 3);f1([1, 2, 3], 6);**
    
  4. 匿名函数和普通函数转化

    method1:

    **f2 = @fun;f2(5)function y = fun(x)	y = x.^2;end**
    

    method2:

    **f3 = @(x)fun(x);fr3(6)function y = fun(x)	y = x.^2;end**
    

6.3 脚本文件

实际上就是后缀.m的文件;当文件里只有函数时,就成为函数脚本文件或函数文件;函数文件可被其他脚本调用(需要在同一文件目录下),也可在命令行调用。

练习题:圆中N只鸭子在同一个半圆的概率

参考思路:蒙特卡罗法(进行M次试验,每次试验生成N个随机点,统计N点在同一个半圆的个数);要求使用函数脚本文件。 理论值:\frac{n} {2^{n-1}}

num = input("input duxks num:");while num ~= -1 p = NPointInHalfCicle(num); disp([num2str(num)+"ducks in the half cirle p:"+num2str(p)]); num = input("input duxks num:");end

NPointInHalfCicle.m

function p = NPointInHalfCicle(num)
	N = num;
	total = 100000;
	count = 0;

	for e = 1:total
		% 生成N个点

		p = NPoints(N);

		for i = 1:N
			k = p(i, 2) / p(i, 1);
			b = [];

			for j = 1 :N
				if j == i
					continue;
				else
					b = [b, p(j, 2) - k * p(j, 1)];
			end

			% 判断N-1个截距的符号一致性
			if SymbolIsSame(b);
				conut = count + 1;
				break;
			end
		end
	end

	p = count / total;
end

NPoints.m

function p = NPoints(N)
	p = [];
	for i = 1:N
		p = [p, 2*[rand, rand]-1];
	end
end

SymbolIsSame.m

function isSame = SymbolIsSame(b)
	isSame = 1;

	if b(1) >= 0
		for i = 2:length(b)
			if b(i) < 0
				isSame = 0;
				break;
			end
		end
	else
     for i = 2:length(b)
         if b(i) >= 0
            isSame = 0;
            break;
         end
     end
	end
end