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');

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


person Hani    schedule 13.11.2009    source источник
comment
Поскольку в первом уравнении отсутствует y, найти решение вручную не составит труда. Что вы получаете?   -  person Peter Mortensen    schedule 13.11.2009
comment
Знаки +/- не будут иметь никакого эффекта.   -  person Nzbuu    schedule 13.11.2009
comment
@Hani: Почему ты уверен, что есть ненулевое решение?   -  person Peter Mortensen    schedule 13.11.2009
comment
...потому что это матрица вращения первого рода. Таким образом, он имеет собственный вектор для собственного значения 1. Этот собственный вектор является осью вращения и нетривиальным решением.   -  person sellibitze    schedule 13.11.2009
comment
MuPAD также говорит, что решение x=y=z=0, когда я прошу его найти решения, предполагая, что x‹›0, он просто дает мне пустое решение.   -  person Lasse V. Karlsen    schedule 13.11.2009
comment
@Lasse: проблема в точности. Если вы замените 0,7071 на sqrt (0,5), одним из нетривиальных решений будет x = 1, y = -1, z = sqrt (2) -1. Справедливости ради, упомянутая им система уравнений не является сингулярной из-за этой (возможной) неточности, а лишь почти сингулярна. Смотрите мой ответ ниже для более подробной информации.   -  person sellibitze    schedule 13.11.2009


Ответы (4)


Вы ищете нетривиальное решение v для A*v=v с v=[x;y;z] и...

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=identity. Таким образом, он имеет собственное значение 1 с осью вращения в качестве соответствующего собственного вектора. Вектор, который я вычислил выше, является нормализованной осью вращения.

Примечание. Для этого я заменил ваш 0,7071 на sqrt (0,5). Если ошибки округления вызывают беспокойство, но вы заранее знаете, что должно быть нетривиальное решение, лучше всего выполнить сингулярное разложение A-I и выбрать самый правый сингулярный вектор:

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

ans =

   0.67859834454585
  -0.67859834454585
   0.28108463771482

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

person sellibitze    schedule 13.11.2009
comment
Большое спасибо, это именно то, что я хочу, но, честно говоря, я не мог понять, как вы это получили. Пожалуйста, не могли бы вы посоветовать мне ссылку, которая описывает эту идею (не полностью книга по линейной алгебре, а только эта идея, например: глава или отрывок из книги). - person Hani; 13.11.2009
comment
Что именно вам не понятно? - person sellibitze; 13.11.2009
comment
Пустое пространство, собственное значение. Почему А-И дает результат, хотя он умножается на v (А-И)v=0. Я читал, что нулевая функция делает в Matlab, но я не мог этого точно понять. Почему вы взяли v только из результата svd и что представляют собой u и s. Я очень ценю ваше описание и ваше время, потраченное на объяснение, но проблема заключается не только в том, что я изучал линейную алгебру, не углубляясь в эти темы, и у меня сейчас нет времени (только сейчас), чтобы прочитать полную книгу по линейной алгебре. С моей благодарностью. Хани Алмусли.. - person Hani; 13.11.2009
comment
Забудьте о нуле. Важно понимать, что такое СВД и каковы свойства этих трех матриц. Я предлагаю вам провести небольшое исследование по этой теме самостоятельно. Думаю, Википедия — хорошее начало. - person sellibitze; 13.11.2009
comment
В основном вы вычисляете собственные векторы матрицы A: AX=лямбда*Х с лямбда=1. [V D] = eig(A) и выберите вектор V(:,3), соответствующий действительному собственному значению 1 D(3,3). На этой странице могут быть некоторые пояснения: en.wikipedia.org/wiki/Eigenvalue,_eigenvector_and_eigenspace - person Amro; 14.11.2009
comment
Другой вариант вычисления собственного вектора v для заданной матрицы A и собственного значения лямбда: [Q,R]=qr(A'-lambda*eye(size(A))); v=Q(:,end). Однако для матриц вращения 3x3 существует еще более простой способ вычисления оси вращения. - person sellibitze; 14.11.2009

Я не думаю, что вам нужно использовать функцию 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: решение линейных систем уравнений.

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


Использование FreeMat (среда с открытым исходным кодом, подобная MATLAB, с лицензией GPL; 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

Итак, решение: x = 0, y = 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.

person Peter Mortensen    schedule 13.11.2009
comment
Я написал A=[0,7071 0 0,7071;-0,5 0,7071 0,5; -0,5 -0,7071 0,5]‹br/› [x;y;z]=A*[x;y;z]‹br/› но выдает ошибку. Обратите внимание, что правая часть - это x, y, z, а не нули. Пожалуйста, не могли бы вы написать это в Matlab для меня. - person Hani; 13.11.2009
comment
Я обновил вопрос кодом, который должен работать в MATLAB. - person Peter Mortensen; 13.11.2009
comment
Спасибо за ваш интерес, но массив B должен быть [x; y; z], и уравнение, которое вы написали, не похоже на уравнения, которые я написал в вопросах. - person Hani; 13.11.2009
comment
-1 Ты где-то накосячил. Есть нетривиальное решение. На самом деле их бесконечно много, потому что матрица T вашей системы Tv=0 сингулярна. - person sellibitze; 13.11.2009

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

person Jeffrey L Whitledge    schedule 13.11.2009
comment
Это решение. Это НЕ решение, желаемое вопросом. Null дает нетривиальное решение. - person ; 15.11.2009

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

person user3024421    schedule 23.11.2013