第一次发CSDN,起因是做地形坡度起伏大小寻找最优分化单元格大小时,需要使用均值变点法对非线性拟合的函数求取其变化趋势的拐点。
但是在搜索网上后,并没有找到相应的代码,SPSS程序也没有相应的直接函数能够计算,故用Matlab自己编写了该代码,保证清晰易懂。以地势起伏度为例。
我们分为以下几步:
1.计算总体数据的方差
2.将一组数从第二个数开始,将其分为两部分,分别计算两部分的方差,并将两部分方差相加
3.分别计算总体数据的方差与(第二部得到的每次方差和)的差
4.寻找值最大的拐点,即为原非线性函数的突变点
-----------------------------------------注意----------------------------------------
例子中读取的表格和数据个数请根据自身情况酌情修改!!!
---------------------------------------------------------------------------------------
%读取单元起伏度,共18个数据
num = xlsread('D:\demDATA\统计结果.xlsx','D2:D19');%单元面积起伏度
cell = xlsread('D:\demDATA\统计结果.xlsx','A2:A19');%格网大小
%计算总体平均值、方差
S = 0,xall = 0;
xall= mean(num);
for i = 1:18
S = S + (num(i)-xall)^2
end
%计算均值变点法差值
%为保证后面下标统一,创建数组长度为18
A = zeros(1,18),B = zeros(1,18);%A为分割左侧总方差,B为分割右侧总方差
x1 = zeros(1,18),x2 = zeros(1,18);%x1为分割左侧平均值,x2为分割右侧平均值
vari = zeros(1,18),diff = zeros(1,18);%vari为两侧方差和,diff为总方差与每组方差和的差值
for i = 2:18
x1(i) = mean (num(1:i-1)),x2(i) = mean (num(i:18));
for j = 1:i-1
A(i) = A(i) + (num(j)-x1(i))^2
end
for k = i:18
B(i) = B(i) + (num(k)-x2(i))^2
end
vari(i) = A(i) + B(i);
diff(i) = S - vari(i);
end
scatter(cell,diff),hold on,plot(cell,diff);
xlabel('格网大小'),ylabel('S-Si'),axis([3 37 0 130]);