Error: Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
3 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
I am getting this error after implemnting my BCs:
clc; clear all;
N=30;
% compute the chebyshev differentiation matrix and x-grid
Ly =3;
eta_ygl = 2/Ly; etagl = -cos(pi*(0:N)/N)'; ygl = (etagl+1)/eta_ygl;
%ygl = -cos(pi*(0:N)/N)'; %Gauss-Lobatto Points
VGL = cos(acos(ygl(:))*(0:N));%C0 operator from thesis
dVGL = diag(1./sqrt(1-ygl.^2))*sin(acos(ygl)*(0:N))*diag(0:N);
dVGL(1,:) = (-1).^(1:N+1).*(0:N).^2;
dVGL(N+1,:) = (0:N).^2;
% Differentiation Matrices for Gauss & GaussLobatto
Dgl = dVGL/VGL;
D = Dgl;
x=ygl;
% compute the derivatives at x (i.e. at the chebyshev grid points)
A=D*eta_ygl;
R = 2*x.*exp(x.^2 - 1);
% boundary condition
A(end,:) = 0;
A(end,end) = 1;
R(end) = exp(8); %u(Ly)
%LHS
A(1,:) = 0;
A(1,1) = 1;
R(1) = exp(-1); %u(0)
% solve
u = A\R;
plot(x,u,'--rs',x,exp(x.^2-1))
legend('Chebyshev','Exact')
The output is okay as shown in the plot, however I am not sure why I get the error and if there's a way to fix this? if I change the BCs I can get rid of the error but then the solution isn't right. Thanks!
0 comentarios
Respuestas (2)
Walter Roberson
el 4 de Oct. de 2023
% Differentiation Matrices for Gauss & GaussLobatto
Dgl = dVGL/VGL;
In MATLAB the / operator is mrdivide, / and is approximately equivalent to dVGL * pinv(VGL) -- which attempts to find linear models relating combinations of columns.
Or perhaps you should be looking at gradient
If you really do mean matrix division... you have the problem that rank(VGL) is only 8 for a 31 x 31 matrix...
1 comentario
Walter Roberson
el 4 de Oct. de 2023
If you proceed at higher precision then the actual rank of VGL is only 3.
Q = @(v) sym(v);
N=30;
% compute the chebyshev differentiation matrix and x-grid
Ly = Q(3);
eta_ygl = Q(2)/Ly;
etagl = -cospi(Q(0:N)/N)';
ygl = (etagl+1)/eta_ygl;
VGL = cos(acos(ygl(:))*(0:N));%C0 operator from thesis
dVGL = diag(1./sqrt(1-ygl.^2))*sin(acos(ygl)*(0:N))*diag(0:N);
dVGL(1,:) = (-Q(1)).^(1:N+1).*(0:N).^2;
dVGL(N+1,:) = Q(0:N).^2;
% Differentiation Matrices for Gauss & GaussLobatto
rank(VGL)
%Dgl = dVGL/VGL;
Bruno Luong
el 4 de Oct. de 2023
Editada: Bruno Luong
el 4 de Oct. de 2023
N=30;
% compute the chebyshev differentiation matrix and x-grid
Ly =3;
eta_ygl = 2/Ly; etagl = -cos(pi*(0:N)/N)'; ygl = (etagl+1)/eta_ygl;
%ygl = -cos(pi*(0:N)/N)'; %Gauss-Lobatto Points
VGL = cos(acos(ygl(:))*(0:N));%C0 operator from thesis
I don't know what the "thesis" is about but I notice with the parameter you set (Ly=3) it is odd that you compute acos of ygl that goes up to 3 and not in the domain [-1,1]; so acos function returns a complex value. Then the imaginary part get large when you multiply by N. Then cos of the complex value behaves like cosh or more or less like an exponential function exp. You matrix VGL has huge dynamic range, and become totally ill-condition because pof this huge dynamic range. The warning about
Dgl = dVGL/VGL
is due to that. I guess your Gauss Labato somehow still working but as MATLAB warning warn 'The result is innacurate".
I guess the setup of Ly=3 is wrong or the way you use it is wrong.
Usually the Gauss Labato points coordinates are derived for [0,1] interval then scale it with mesh size. The mesh size should not be used i argument.
0 comentarios
Ver también
Categorías
Más información sobre Linear Algebra en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
