
Regarding grid generation using finite difference method (*code fixed)
8 次查看(过去 30 天)
显示 更早的评论
Hi everyone,
I'm trying to generate a uniform grid where the red lines intersect at a 45-degree angle to the horizontal lines in blue using the finite difference method in MATLAB.
However, the resulting grid is slightly off, as shown in the attached image. Intesection angle is uniform but higher than 45-degree.
I set computational domain as
and a grid is generated on physical domain with coordinates
.


As I want to generate a mesh described above, I aimed to solve the following PDE :

where we have
(horizontal lines). The boundary conditions are
.



The above equation comes down to the following:

Based on the above equation, I discretized to finite difference form (central difference for
and forward differece for
).


Plus, I found the grid collapses when I set different angles (for example 90-degree (replace
)).

Am I missing something in implementation?
I need your help.
Here is my code.
% Parameter settings
eta_max = 10;
xi_max = 10;
Delta_eta = 0.1;
Delta_xi = 0.1;
tol = 1e-6;
max_iterations = 100000;
% Grid size
eta_steps = floor(eta_max / Delta_eta) + 1;
xi_steps = floor(xi_max / Delta_xi) + 1;
% Initial conditions
x = zeros(eta_steps, xi_steps);
y = repmat((0:eta_steps-1)' * Delta_eta, 1, xi_steps);
% Boundary conditions
x(1, :) = linspace(0, xi_max, xi_steps);
% Finite difference method
converged = false;
iteration = 0;
while ~converged && iteration < max_iterations
iteration = iteration + 1;
max_error = 0;
for n = 1:eta_steps - 1
for m = 2:xi_steps - 1
x_xi = (x(n, m+1) - x(n, m-1)) / (2 * Delta_xi);
y_xi = (y(n, m+1) - y(n, m-1)) / (2 * Delta_xi);
new_x = x(n, m) + Delta_eta * ((pi/4) - y_xi)/(x_xi);
error_x = abs(new_x - x(n, m));
max_error = max([max_error, error_x]);
x(n + 1, m) = new_x;
end
x(n+1, xi_steps) = x(n+1, xi_steps-1) + Delta_xi;
x(n+1, 1) = x(n+1, 2) - Delta_xi;
end
if max_error < tol
converged = true;
end
end
% Plot the results
figure; hold on; axis equal; grid on;
for m = 1:xi_steps
plot(x(:, m), y(:, m), 'r');
end
for n = 1:eta_steps
plot(x(n, :), y(n, :), 'b');
end
title(['Iterations until convergence: ', num2str(iteration)]);
xlabel('x'); ylabel('y');

0 个评论
采纳的回答
David Goodmanson
2025-4-7
Hello arxiv,
It appears that what you want in the code is not
new_x = x(n, m) + Delta_eta * ((pi/4) - y_xi)/(x_xi);
but rather
new_x = x(n, m) + Delta_eta * (tan(pi/4) - y_xi)/(x_xi);
= x(n, m) + Delta_eta * ( 1 - y_xi)/(x_xi);
which leads to

更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Partial Differential Equation Toolbox 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!