我有一个 3D 密度函数 q(x,y,z),我试图在 Matlab 8.3.0.532 (R2014a) 中绘制它。
我的函数域从 a 开始,到 b 结束,间距为 ds。我想在三元曲面图上绘制密度,图中的每个维度代表给定点 x、y、z 的比例。例如,如果我在 q(1,1,1) 的域上有一个密度单位,在 q(17,17,17) 的域上有另一个密度单位,在这两种情况下,x 的比例相等,因此,y,z 和 I 在坐标 (1/3,1/3,1/3) 处的三元曲面图上有两个密度单位。我有使用ternsurf的代码. 问题是比例点的数量随着域的大小呈指数增长。目前我只能用单位间距(ds = 1)绘制一个大小为 10(每个维度)的域。但是,我需要一个比这大得多的域(每个维度的大小为 100)并且比单位间距小得多(理想情况下小至 0.1) - 这将导致 100^3 * (1/0.1)^3 点在网格上,这是 Matlab 无法处理的。有没有人知道如何通过 3D 比例以某种方式对密度函数进行分类以减少点数?
我的工作代码与示例:
a = 0; % start of domain
b = 10; % end of domain
ds = 1; % spacing
[x, y, z] = ndgrid((a:ds:b)); % generate 3D independent variables
n = size(x);
q = zeros(n); % generate 3D dependent variable with some norm distributed density
for i = 1:n(1)
for j = 1:n(2)
for k = 1:n(2)
q(i,j,k) = exp(-(((x(i,j,k) - 10)^2 + (y(i,j,k) - 10)^2 + (z(i,j,k) - 10)^2) / 20));
end
end
end
Total = x + y + z; % calculate the total of x,y,z at every point in the domain
x = x ./ Total; % find the proportion of x at every point in the domain
y = y ./ Total; % find the proportion of y at every point in the domain
z = z ./ Total; % find the proportion of z at every point in the domain
x(isnan(x)) = 0; % set coordinate (0,0,0) to 0
y(isnan(y)) = 0; % set coordinate (0,0,0) to 0
z(isnan(z)) = 0; % set coordinate (0,0,0) to 0
xP = reshape(x,[1, numel(x)]); % create a vector of the proportions of x
yP = reshape(y,[1, numel(y)]); % create a vector of the proportions of y
zP = reshape(z,[1, numel(z)]); % create a vector of the proportions of z
q = reshape(q,[1, numel(q)]); % create a vector of the dependent variable q
ternsurf(xP, yP, q); % plot the ternary surface of q against proportions
shading(gca, 'interp');
colorbar
view(2)