用递归法实现多重网格法——MATLAB

FMG运行图

用递归法实现多重网格法——MATLAB_第1张图片

MATLAB递归代码

clear; clc;
global f1
f1 = fopen('out1.txt', 'w'); %该文件只是为了测试
k = 5; ks = 1;		% 总的网格层、开始层
gamma = 1; ncy = 1;	% 类型(V or W), 总的循环次数 
nu0 = 6; nu1 =2; nu2 = 1; 
fmg(k, ks, nu0, nu1, nu2, gamma, ncy)
fclose(f1);
a = load('out1.txt');
figure(1)
plot(a, 'bo-', 'LineWidth', 1.5);

% FMG
function fmg(k, ks, nu0, nu1, nu2, gamma, ncy)
global f1
if k == ks
    if ks == 1
        for i = 1 : nu0
			% 迭代代码
            fprintf(f1, '%d\n', k);
        end
    else
        for j = 1 : ncy
            cycle(k, nu0, nu1, nu2, gamma);
        end
    end
else
    if k > ks
        fmg(k - 1, ks, nu0, nu1, nu2, gamma, ncy)		
		% 向高一层插值代码		
        for j = 1 : ncy
            cycle(k, nu0, nu1, nu2, gamma);
        end
    end
end
end

function cycle(k, nu0, nu1, nu2, gamma)
global f1
if k == 1
    for i = 1 : nu0
		% 迭代代码
        fprintf(f1, '%d\n', k);
    end
else
    for i = 1 : nu1
		% 迭代代码
        fprintf(f1, '%d\n', k);
    end    
    for j = 1 : gamma
        cycle(k - 1, nu0, nu1, nu2, gamma);
    end    
    for i = 1 : nu2
		% 迭代代码
        fprintf(f1, '%d\n', k);
    end
end
end

运行图

用递归法实现多重网格法——MATLAB_第2张图片
由上图可知,实现了FMG循环的功能。

参考文献

  • Venner C.H., Lubrecht A.A. Multilevel methods in lubrication [M]. Elsevier, 2000.

你可能感兴趣的:(matlab代码)