2014-01-05 5 views
2

A= [1 2 3;3 4 5;5 6 7], B=[1;1;1]. Мне нужно решить уравнение AX = B. Здесь я использую код Matlab, например X=linsolve(A,B). Но, используя это предупреждение произошло ...Как решить линейное уравнение с помощью Matlab?

«Предупреждение: Матрица близка к вырожденной или плохо масштабируется результаты могут быть неточными RCOND = 1.541976e-18...»

Как исправить ошибку?

+0

Это, вероятно, лучшее место для такого рода вопросов http://math.stackexchange.com/ – user2485710

+0

Ваша матрица 'A' ​​является особой, и поэтому существуют бесконечные решения. –

+0

@ LuisMendo, как преобразовать сингулярную матрицу в невырожденную без изменения данных – Jaya

ответ

1

Вы не можете делать то, что вы хотите: «преобразовать особую матрицу в неособо без изменения данных», но вы можете найти одно решение вашей системы Ax = B с помощью pseudoinverse, pinv.

Ответ тот же, что и при использовании mldivide. Предупреждение, которое вы получили с помощью mldivide (или \), является предупреждением, а не ошибкой. Проверьте this link, чтобы узнать, как вы можете подавить предупреждение, если вам нужно работать с сингулярными матрицами и устать от предупреждений.

x = pinv(A)*B; 
x = 
    -5.0000e-01 
    1.2490e-16 
    5.0000e-01 

Что дает:

A*x 
ans = 
    1.00000 
    1.00000 
    1.00000 

От Egons answer к similar question:

Но помните, что такая система не имеет единственное решение, так как псевдообратная и оператор обратной косой черты может (и в этом случае ) будет возвращать очень разные решения, независимо от того, является ли любой из них приемлемый действительно зависит от вашего приложения.

+1

Что касается 'mldivide' vs.' pinv', [this] (http://stackoverflow.com/a/19718075/2778484) может представлять интерес. – chappjc

+0

Хотя математически корректно, решение уравнений, вычисляя обратное сначала, НЕ является тем, как идти в Matlab. Это может привести к проблемам точности, даже в тех случаях, когда обычные методы работают нормально. См. [Этот блог Лорен] (http://blogs.mathworks.com/loren/2007/05/16/purpose-of-inv/#2) по этому вопросу. –

1

Три вектора [1,2,3],[3,4,5],[5,6,7] лежат в одном самолете. Откуда мне знать? Это потому, что я вижу это [3,4,5]-[1,2,3]=[2,2,2] и [3,4,5]+[2,2,2]=[5,6,7].

Таким образом, когда возникает вопрос, «какая линейная комбинация этих трех векторов приводит меня в эту точку», таких точек существует бесконечно много, если точка находится в плоскости, а ни одна, если она не является. Только путем осмотра вы можете увидеть

[1,1,1] = ([3,4,5]-[1,2,3])/2 

Значение решения является [-0.5 0.5 0]

Или

[1,1,1] = ([5,6,7] - [3,4,5])/2 

Значения решения является [0 -0.5 0.5]

Etc.

Вы не можете сделать проблемы чего-то нет - и в этом он плохо обучен, поэтому существует бесконечно много решений. Matlab обрабатывает его в этом случае, но предупреждает вас. Карандаш и бумага приведут вас к такому же выводу. Нет однозначного ответа.

1

Предполагая, что вы знаете, что решение может не существовать, вы можете просто запросить второй выходной аргумент. Это скажет Matlat, что вы знаете о проблеме и просто хотите получить наилучшее возможное решение.

Вот как это делается:

[X, R] = linsolve(A,B) 

Упоминается в doc конечно.

Смежные вопросы