필터 지우기
필터 지우기

Code not working.

조회 수: 2 (최근 30일)
adrooney
adrooney 2015년 12월 3일
답변: Walter Roberson 2015년 12월 3일
Hi, I got this code on the mit website, However I am not able to run the code please have a look
%---------------------------------------------------------------------
levels = 5; % size of problem
nu1 = 2; % number of presmoothing iterations
nu2 = 2; % number of postsmoothing iterations
gamma = 2; % number of coarse grid iterations (1=V-cycle, 2=W-cycle)
%---------------------------------------------------------------------
n = 2^(levels+2)-1; % number of grid points
h = 1/(n+1);
x = (h:h:(1-h))';
f = pi^2*(sin(pi*x)+4^2*sin(pi*4*x)+9^2*sin(pi*9*x));
A = spdiags(ones(n,1)*[-1 2 -1],-1:1,n,n);
b = f*h^2;
uc = A\b;
global t level, t = 0; level = levels;
clf, subplot(2,2,3:4), hold on
u = twogrid(A,b,nu1,nu2,gamma);
hold off, axis tight
subplot(2,2,1), plot(x,u,'b.-',x,uc,'r.--')
title('correct solution and multigrid approximation')
subplot(2,2,2), plot(x,uc-u,'r.-')
title('error')
%=====================================================================
function x = twogrid(A,b,nu1,nu2,gamma,x0)
%TWOGRID
% Recursive twogrid cycle for 1d Poisson problem.
% nu1 = number of presmoothing iterations (Gauss-Seidel)
% nu2 = number of postsmoothing iterations (Gauss-Seidel)
% gamma = number of coarse grid iterations (1=V-cycle, 2=W-cycle)
% x0 = starting vector (0 if not prescribed)
global t level
n = length(b);
if n<4
x = A\b; % solve exactly at coarsest level
else
G = speye(n)-tril(A)\A; cG = tril(A)\b; % create Gauss-Seidel
I = spdiags(ones(n-2,1)*[1 2 1],-2:0,n,n-2); % create interpolation
I = I(:,1:2:end)/2; R = I'/2; % and restriction matrices
if nargin<6, x = b*0; else, x = x0; end % starting vector
for i = 1:nu1, x = G*x+cG; end % presmoothing
r = b-A*x; % compute residual
rh = R*r; % restrict residual to coarse grid
t = t+1; level = level-1; plot([t-1 t],[level+1 level],'bo-')
eh = rh*0; % starting vector
for i = 1:gamma
eh = twogrid(R*A*I,rh,nu1,nu2,gamma,eh); % coarse grid iteration
end
e = I*eh; % interpolate error
t = t+1; level = level+1; plot([t-1 t],[level-1 level],'bo-')
x = x+e; % update solution
for i = 1:nu2, x = G*x+cG; end % postsmoothing
end

채택된 답변

Walter Roberson
Walter Roberson 2015년 12월 3일
It appears to work fine for me.
Note: in order to use a "function", the code for the function must be written in to a .m file and that .m file must start with the word "function" (or sometimes "classdef"). It is not allowed to enter a function at the command prompt, and it is not allowed to have a "function" in a .m file that starts with executable code such as an assignment.
You can store from "function x = twogrid" onward in a file named twogrid.m . Or you can store everything in one .m file, provided that you start that .m file with
function TheNameOfTheFileGoesHere
For example I used
function test258671
and stored it all in test258671.m

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Scripts에 대해 자세히 알아보기

태그

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by