使用Matlab基于密度函数生成不等步的网格

问题描述 投票:1回答:2

我正在尝试生成步长不相等且元素数量固定的一维网格(与初始网格相同)。该长度应与节点密度成正比。在示例中,此密度与函数的梯度成反比。[例如,假设您在一维网格中具有温度分布,并且希望在温度梯度较高的网格部分中使网格更密集]

这是我到目前为止编码的内容:

% % % Initial fixed-step 1D mesh
X=(0:.01:2)';
% % % Values of a function at each mesh node [in this example,  f(x)=5*sin(2*pi*x)*x ]
Y=5*sin(2*pi*X).*X;

% % % Calculate density of mesh points based on the Y function gradient
rho=[1e-9; abs(diff(Y))];

% % % Calculate x-steps from the original mesh
h = diff(X);
% % % Rescale the steps based on the inverse of the density
F = cumsum([0; h]./rho);
% % % Make sure F is between 0 and 1
F = F/F(end);
% % % Calculate the new mesh with scaled steps
X2 = X(1) + F * (X(end)-X(1));
% % % Interpolate the function Y at the new positions
Y2 = interp1(X,Y,X2);

% % % Plot
figure
subplot(2,1,1)
hold on
plot(X,Y,'ko-')
plot(X2,Y2,'r.-')
xlabel('x')
ylabel('y')
subplot(2,1,2)
plot(X,rho,'ko-')
xlabel('x')
ylabel('rho')

这种方法存在一些问题:1.从本示例中可以看到,当密度非常低(渐变几乎为零)时,会有很大的跳跃。如何实现最小/最大时间步长?2.正确计算了节点密度,但是在“积分”了不相等的步长之后,可能会发生这样的情况:当梯度较小时,施加的较大时间步长会导致跳过应该具有更精细时间步长的高梯度区域。 [例如,请在下面的示例中查看1.8-1.9区域,该区域应该具有较小的时间步长,因为它具有较高的节点密度,但是步长约为1.75时会跳过X的较大部分]] >

任何改善我的代码的建议将不胜感激!

我正在尝试生成步长不相等且元素数量固定的一维网格(与初始网格相同)。该长度应与节点密度成正比。在示例中,此...

matlab gradient mesh
2个回答
2
投票

计算rho的累积总和(CDF)。从CDF中获取等距的样本。从CDF映射到X以获取新的X3。从X3映射到Y以获取Y3


0
投票

rahnema1的回答给了我很大的帮助,但是仍然存在两个问题:1-新网格的第一个元素与原始网格的第一个元素不同2-如果在某个点上的梯度为零,则interp1函数将给出错误[[网格矢量并非严格单调递增。“]

© www.soinside.com 2019 - 2024. All rights reserved.