简介
如今,计算模型已用于自然科学、社会科学和工程的大多数领域。 UQLAB 平台的目的是量化模型参数中的不确定性对此类模型预测的影响。本文描述了如何在 UQLab 平台中定义这样的计算模型。模型可以像 Matlab 句柄函数或 Matlab.m 文件一样简单。可以通过将第三方代码包装到 m 文件中来使用它们。
不确定量化中常见模型有:分析函数、数值模型、第三方代码包装、工作流。UQLAB MODEL 模块提供了一个方便的工具,可以在不确定性量化分析中包含前三种类型的模型(函数、数值模型和包装器)。
方法
创建分析函数模型
其中 a = 7 和 b = 0.1 是标量值。输入向量 X 包括 3 个均匀分布在区间 Xi ∼ U(-π, π) 中的分量。
(运行下一块代码时记得clear,以免出错!)
(1)从*.m文件中创建分析函数模型
ishigami_function.m
function Y = ishigami_function(X)
Y = sin(X(:,1)) + 7*(sin(X(:,2).^2)) + 0.1*(X(:,3).^4).*sin(X(:,1));
end
该函数是矢量化的,
size(X)=[N,M];
X的每一行对应X的一个实现,每一列对应于X的一个分量。可以在 UQLAB 中从刚刚创建的函数中创建一个 MODEL 对象,如下所示:
uqlab
%字符串中的值为函数名
modelopts.mFile = 'ishigami_function';
myModel = uq_createModel(modelopts);
可以对输入矩阵X的模型响应进行评估:
Y = uq_evalModel(X);
UQLab默认*.m文件是矢量化的,可以指定所提供函数为非矢量化的:
ishigami_function_nonVec.m
function Y = ishigami_function_nonVec(X)
Y = sin(X(1)) + 7*(sin(X(2)^2)) + 0.1*X(3)^4.*sin(X(1));
end
启用非矢量评估
modelopts.mFile = 'ishigami_function_nonVec';
modelopts.isVectorized = false;
myModel = uq_createModel(modelopts);
在许多情况下,模型函数需要额外的非随机参数才能正确执行,例如非随机值、标志甚至配置文件。可以使用 .Parameters 结构在 MODEL 对象中包含非随机参数。其函数如下:
ishigami_function_parametric.m
function Y = ishigami_function_parametric(X,P)
Y = sin(X(:,1)) + P(1)*(sin(X(:,2).^2)) + P(2)*(X(:,3).^4).*sin(X(:,1));
end
可以使用如下代码设置P的值:
modelopts.mFile = 'ishigami_function_parametric';
modelopts.Parameters = [7, 0.1];
myModel = uq_createModel(modelopts);
可以随时更改现有模型的参数值:
myModel.Parameters(2) = 0.05;
(2)从函数句柄创建模型
f = @(X) sin(X(1)) + 7*(sin(X(2)^2)) + 0.1*(X(3)^4).*sin(X(1));
modelopts.mHandle = f;
myModel = uq_createModel(modelopts);
默认情况下,函数句柄是非矢量化的。同样,可以设置成矢量化的:
f = @(X) sin(X(:,1)) + 7*(sin(X(:,2).^2)) + 0.1*(X(:,3).^4).*sin(X(:,1));
modelopts.mHandle = f;
modelopts.isVectorized = true;
myModel = uq_createModel(modelopts);
函数句柄设置参数:
f = @(X,P) sin(X(1)) + P(1)*(sin(X(2)^2)) + P(2)*(X(3)^4).*sin(X(1));
modelopts.mHandle = f;
modelopts.Parameters = [7, 0.1];
myModel = uq_createModel(modelopts);
更改模型参数:
myModel.Parameters(2) = 0.05;
(3)从文本字符串创建模型
该函数模型的非参数、非矢量化版本可以定义为:
modelopts.mString = 'sin(X(1)) + 7*(sin(X(2)^2)) + 0.1*X(3)^4.*sin(X(1))'
矢量化:
modelopts.mString = 'sin(X(:,1)) + 7*(sin(X(:,2).^2)) + 0.1*(X(:,3).^4).*sin(X(:,1))';
modelopts.isVectorized = true;
myModel = uq_createModel(modelopts);
参数字符串:
modelopts.mString = 'sin(X(:,1)) + P(1)*(sin(X(:,2).^2)) + P(2)*(X(:,3).^4).*sin(X(:,1))';
modelopts.Parameters = [7, 0.1];
myModel = uq_createModel(modelopts);
更改参数:
myModel.Parameters(2) = 0.05;