У меня есть функция трехмерной плотности 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, и поэтому у меня будет две единицы плотности на моем троичном поверхностном графике в координатах (1/3,1/3,1/3). У меня есть код, который работает с использованием ternsurf. Проблема в том, что количество точек пропорции растет экспоненциально быстро с размером домена. На данный момент я могу построить только область размером 10 (в каждом измерении) с единичным интервалом (ds = 1). Однако мне нужен гораздо больший домен, чем этот (размер 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)