【发布时间】:2020-07-29 13:53:09
【问题描述】:
我正在尝试生成一个步长不等的一维网格,并且具有固定数量的元素 [与初始网格相同]。 长度应与节点密度成正比。在示例中,该密度与函数的梯度成反比。 [例如,假设您在一维网格中具有温度分布,并且您希望在温度梯度较高的网格部分使网格更密集]
这是我目前编写的代码:
% % % 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]
任何改进我的代码的建议将不胜感激!
【问题讨论】:
-
PS 我在这里找到了我的初始代码的原始想法:math.uci.edu/~chenlong/226/Ch4AFEM.pdf