Проблема использования формата пятиточечной разности для решения уравнения Пуассона с помощью Matlab

Задача поставлена ​​так: уравнение Пуассона. Я хочу решить это с помощью формата пятибалльной разницы. Но у меня есть некоторые проблемы в коде.

введите здесь описание изображения

Код

function F = fivepointdiff(~,n)
h=1/n;
N=2*(n-1)*n+(3*n-1)*(n-1);
XY=zeros(2,n);
for i = 1:n
    for j=1:n-1
        XY(:,(n-1)*(i-1)+j)=[1+j*h;i*h];
    end
end
for i =1:n-1
    for j=1:3*n-1
        XY(:,n*(n-1)+(3*n-1)*(i-1)+j)=[j*h;1+i*h];
    end
end
for i=1:n
    for j=1:n-1
        XY(:,n*(n-1)+(3*n-1)*(n-1)+(n-1)*(i-1)+j)=[1+j*h;2*1+(i-1)*h];
    end
end
A=zeros(N,N);
for i=1:N
    for j=1:N
        if(i==j)
            A(i,j)=4;
        else if(((XY(1,i)-XY(1,j))^2+(XY(2,i)-XY(2,j))^2)<2*h*h)
                A(i,j)=-1;
            end
        end
    end
end
f=zeros(N,1);
for i =1:N
    f(i,1)=h*h;
end
U=bicg(A,f,0,1,100);
F=[XY;U'];
                

Когда я запускаю его, есть какая-то ошибка

пятиточечный дифференциал (1, 25)

Предупреждение: входной допуск может быть недостижим с помощью BICG. Попробуйте использовать больший допуск.

В биг (строка 104)

В Fivepointdiff (строка 35)

Ошибка при использовании big (строка 135)

Предобуславливатель должен быть квадратной матрицей размера 2976, чтобы соответствовать размеру задачи.

Ошибка в Fivepointdiff (строка 35)

U=big(A,f,0,1,100);


person Zhao Su    schedule 22.06.2020    source источник


Ответы (1)


Вы неправильно используете функцию 'big'.

Согласно: https://www.mathworks.com/help/matlab/ref/bicg.html

x = bicg(A,b,tol,maxit,M)
  • Третий аргумент «tol» — это допуск, и он не может быть равен 0, и это причина предупреждения, которое вы получаете. (Предупреждение: ввод может быть недостижим с помощью BICG. Попробуйте использовать больший допуск)
  • «maxit» — это максимальное количество итераций, и нелогично устанавливать его равным 1.
  • Наконец, M должна быть матрицей тех же размеров, что и A, а не числом, как вы указали. Использование этой матрицы может улучшить числовые свойства задачи и эффективность расчета, и ее использование не является обязательным.

Итак, вам нужно изменить аргументы функции, может быть, что-то вроде этого:

x = bicg(A,b,1e-6,1000)
person Yahia Nagib    schedule 25.06.2020