敏感性分析一般借助simlab软件,具体敏感性分析的方法可以参考https://www.jianshu.com/p/2656af9f8d81
首先通过simlab软件进行样本采样,生成.SAM文件(我定义了7个参数),
然后读取文件中的参数值,代入PROSAIL模型
不了解PROSAIL的可以参考https://blog.csdn.net/weixin_45452300/article/details/105300067
得到的结果生成是simlab可以读取的模型结果文件。
import os
import prosail
para_dir = r'C:\Users\Administrator\Desktop\在家写的小程序'
data_dir = r'C:\Users\Administrator\Desktop\在家写的小程序'
with open(os.path.join(para_dir,'prosailoutput3.txt'),'a') as fp2:# 打开创建输出结果文件
fp2.writelines(['1','\n','spectrum','\n','time = yes','\n'])
with open(os.path.join(para_dir,'prosailminganx3.sam'),'r') as fp:
fp.readline() # 第一行
number = fp.readline() #第二行为生成参数个数
fp.readline() #变量个数
fp.readline() #0 此后开始读参数
fp2.write(str(number))
for i in range(int(number)):#提取参数
sim_paraments = list(map(float,fp.readline().split('\t')[:-1]))
rr = prosail.run_prosail(sim_paraments[0], sim_paraments[1], sim_paraments[2], sim_paraments[3], sim_paraments[4], sim_paraments[5], sim_paraments[6], -0.35, 0.01,
30., 10., 0., typelidf=2,
rsoil = 1., psoil=1., factor="SDR")
fp2.writelines(['RUN',' ',str(i),'\n'])
fp2.write('2101')
fp2.write('\n')
for j in range(2101):
fp2.writelines([str(j+400),' ',str(rr[j]),'\n'])
if i%50==0:
print(i)
得到结果
经过simlab分析后得到敏感性结果,做成图如下
这里有个问题尚未解决,采样一阶敏感性指数作图时发现采样次数小的话,参数的一阶敏感性指数之和会大于一,3000次左右采样后就不大于一了。
采样2000次
采样3500次