2009-11-13 2 views
1

Я хочу решить эти уравнения, используя MATLAB и Уверен, что существует ненулевое решение. Уравнения:Решение проблемы уравнений MATLAB

0.7071*x   + 0.7071*z = x 
    -0.5*x + 0.7071*y + 0.5*z = y 
    -0.5*x - 0.7071*y + 0.5*z = z 

я написал в MATLAB:

[x,y,z]=solve('0.7071 * x+0.7071 * z=x','-0.5 * x+0.7071 * y+0.5 * z=y','-0.5 * x-0.7071 * y+0.5 * z=z'); 

Но результат х = у = г = 0. Как я уже сказал, я уверен, что есть решение. Может ли кто-нибудь помочь?

+0

Поскольку первое уравнение отсутствует, не должно быть трудно найти решение вручную. Что вы получаете? Знаки –

+0

+/- не будут иметь никакого эффекта. – Nzbuu

+0

@ Хани: Почему вы уверены, что существует ненулевое решение? –

ответ

5

Вы ищете нетривиальное решение у к А * V = с у = [х, у, г] и ...

A = 
    0.70710678118655     0 0.70710678118655 
    -0.50000000000000 0.70710678118655 0.50000000000000 
    -0.50000000000000 -0.70710678118655 0.50000000000000 

Вы можете превратить это в (AI) v = 0, где I - тождественная матрица 3x3. Что нужно сделать, чтобы найти нетривиальное решение проверяет нулевое пространство A-I:

>> null(A-eye(3)) 

ans = 

    0.67859834454585 
    -0.67859834454585 
    0.28108463771482 

Итак, у вас есть одномерный нуль-пространство. В противном случае вы увидите более одного столбца. Каждая линейная комбинация столбцов является точкой в ​​этом нулевом пространстве, в которой A-I отображает нулевой вектор. Таким образом, каждое кратное этого вектора является решением вашей проблемы.

На самом деле, ваша матрица A является матрицей вращения первого рода, так как det (A) = 1 и A '* A = тождество. Таким образом, оно имеет собственное значение 1 с осью вращения в качестве соответствующего собственного вектора. Вычисленный выше вектор I является нормированной осью вращения.

Примечание: для этого я заменил ваш 0.7071 на sqrt (0.5). Если ошибки округления являются проблемой, но вы знаете заранее, что там должен быть нетривиальным решением лучший выбор, чтобы сделать сингулярное разложение ИИ и выбрать право наиболее правый сингулярный вектор:

>> [u,s,v] = svd(A-eye(3)); 
>> v(:,end) 

ans = 

    0.67859834454585 
    -0.67859834454585 
    0.28108463771482 

Таким образом, вы может вычислить вектор v, который минимизирует | A * vv | при условии, что | v | = 1, где |. | является евклидовой нормой.

+0

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

+0

Что именно вы не понимаете? – sellibitze

+0

Пустое пространство, собственное значение. Почему A-I дает результат, хотя он умножается на v (A-I) v = 0. Я читал, какую функцию нулевой функции выполняет в Matlab, но я не мог ее точно понять. Почему вы взяли v только из результата svd и что представляют собой u и s. Я очень ценю ваше описание и ваше время, потраченное на объяснение, но проблема кроется в том, что я изучил линейную алгебру, не углубляясь в эти темы, и теперь у меня нет времени (сейчас), чтобы прочитать полную книгу для линейной алгебры. С моей благодарностью. Хани Альмусли .. – Hani

4

Я не думаю, что вам нужно использовать функцию solve, так как ваши уравнения представляют собой систему линейных уравнений.

Сформулировать в качестве матричного уравнения:

Ax = B 

В вашем случае:

| -0.2929 0.0  0.7071 | | x |  | 0 | 
    | -0.5  -0.2929 0.5  | | y | = | 0 | 
    | -0.5  -0.7071 -0.5  | | z |  | 0 | 

Использование встроенного функционально из MATLAB, чтобы решить эту проблему. См. MATLAB: Solution of Linear Systems of Equations.

Ядром MATLAB является решение такого уравнения.


Использование FreeMat (с открытым исходным кодом MATLAB-среде с лицензию GPL; direct download URL для установщика Windows):

A = [ -0.2929 0.0 0.7071; -0.5 -0.2929 0.5; -0.5 -0.7071 -0.5 ] 

    B = [0.0; 0.0; 0.0] 

    A\B 

    ans = 
    0 
    0 
    0 

Таким образом, решение является: х = 0, у = 0, z = 0


Решение также может быть получено вручную. Исходя из последних двух уравнений:

-0.5*x + 0.7071*y + 0.5*z = y 
    -0.5*x - 0.7071*y + 0.5*z = z 

    0.2929*y = -0.5*x + 0.5*z 
    0.7071*y = -0.5*x + 0.5*z 

    0.2929*y = 0.7071*y 

Таким образом, у = 0,0 и:

0.7071*y = -0.5*x + 0.5*z 

    0 = -0.5*x + 0.5*z 

    0 = -0.5*x + 0.5*z 

    0.5*x = 0.5*z 

    x = z 

Вставка в первом уравнении:

0.7071*x + 0.7071*z = x 

    0.7071*x + 0.7071*x = x 

    1.4142*x = x 

Таким образом, х = 0.0. А так как x = z, то z = 0.0.

+0

Я написал A = [0.7071 0 0.7071; -0.5 0.7071 0.5; -0.5 -0.7071 0.5]
[x; y; z] = A * [x; y; z]
, но он дает ошибку. Обратите внимание, что правая часть - это x, y, z не нули. Пожалуйста, вы можете написать ее в Matlab для меня. – Hani

+0

Я обновил вопрос с кодом, который должен запускаться в MATLAB. –

+0

Спасибо за ваш интерес, но массив B должен быть [x; y; z], а написанное вами уравнение не похоже на уравнения, которые я написал в вопросах. – Hani

0

x = 0, y = 0, z = 0 - правильное решение. Эту проблему можно легко сработать вручную.

+0

Это решение. Это НЕ РЕШЕНИЕ, требуемое вопросом. Null дает нетривиальное решение. – 2009-11-14 22:57:57

-1
A = [ 0.7071 0 0.7071 ; 
     -0.5 0.7071 0.5 ; 
    -0.5 -0.7071 0.5 ]; 
B = [1 ; 1 ; 1]; 

AA = A-diag(B) 

     -0.2929   0  0.7071 
     -0.5  -0.2929   0.5 
     -0.5  -0.7071   -0.5 

BB = B-B 

    0 
    0 
    0 

AA\BB 

    0 
    0 
    0 
-1

Друзья используют команду MATLAB rref (A) для Ax = B .... Это даст верхнюю треугольную матрицу. Тогда u может легко вычислять нетривиальные решения ... Но имейте в виду, что если rref (A) = I (как в вашем случае), то нетривиальных решений не существует. BEST OF LUCK

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