Как найти единственное решение для нормы (a, 2) == c;когда c является скаляром и a = [x abs (1 / x); x + 1 1 / x] - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь найти уникальное решение для следующего уравнения, используя Matlab

               norm(a,2)=0.11

, когда x является переменной и a=[x abs(1/x);x+1 1/x].b - это точная формулировка norm(a,2), которую я получил:

syms x
a=[x abs(1/x);x+1 1/x];
b = norm(a,2)

b = max(abs(2*x + x*abs(x)^2 + 2*x*abs(x)^4 + abs(x)^4 + x^2*abs(x)^2 - (4*x*abs(x)^5 + 2*x*abs(x)^6 + 4*x*abs(x)^8 + abs(x)^8 + 8*x^2*abs(x)^3 + x^2*abs(x)^4 + 4*x^3*abs(x)^3 + 2*x^3*abs(x)^4 + 6*x^2*abs(x)^6 + x^4*abs(x)^4 + 4*x^3*abs(x)^6 + 4*x^2*abs(x)^8 + 4*x^2)^(1/2))/(2*abs(x)^3), abs(2*x + x*abs(x)^2 + 2*x*abs(x)^4 + abs(x)^4 + x^2*abs(x)^2 + (4*x*abs(x)^5 + 2*x*abs(x)^6 + 4*x*abs(x)^8 + abs(x)^8 + 8*x^2*abs(x)^3 + x^2*abs(x)^4 + 4*x^3*abs(x)^3 + 2*x^3*abs(x)^4 + 6*x^2*abs(x)^6 + x^4*abs(x)^4 + 4*x^3*abs(x)^6 + 4*x^2*abs(x)^8 + 4*x^2)^(1/2))/(2*abs(x)^3))^(1/2)

Я попробовал solve(), и результат следующий:

solve(b==0.11,x) 
Warning: Cannot find explicit solution.

ans =Пустое sym: 0 на 1

Любая помощь относительно подходящего метода для решения вышеупомянутого уравнения будет принята.

1 Ответ

0 голосов
/ 05 марта 2019

Насколько я знаю,

norm(a) = max(svd(a))

max является проблемой в этом уравнении, поэтому я бы нашел и решил символические уравнения для обоих svd результатов отдельно:

syms x
a=[x abs(1/x);x+1 1/x];

s = svd(a);

% svd 1
solve(s(1)==0.11,x) 

% svd 2
solve(s(2)==0.11,x)

Возвращаемое значение для SVD 1:

Warning: Cannot solve symbolically. Returning a numeric approximation instead. 

ans = -12.84595601211006224344551434882

Возвращаемое значение для SVD 2:

Warning: Cannot find explicit solution. 

ans = Empty sym: 0-by-1

Таким образом, ответ будет

ans = -12.84595601211006224344551434882

Если мыбыло решение для каждой части SVD, мы могли бы найти max () из них.

Вот график обеих функций svd:

enter image description here

ОБНОВЛЕНИЕ

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

Чтобы найти все решение (на самом деле их может быть больше двух), я бы напрямую использовал числовой решатель vpasolve и либо вводил начальное предположение, либо разрешал решателю находить решения случайным образом:

vpasolve(s(1)==0.11,x,2) % input initial guess as 2

Возвращает второе решение:

ans = 2.2626424161863046178372248086765

Или использует случайное предположение:

for n = 1:10 
    vpasolve(s(1)==0.11,x,'Random',true) % use random guess
end

Возвращает всенайденное решение:

ans = -12.84595601211006224344551434882 
ans = -12.84595601211006224344551434882 
ans = -12.84595601211006224344551434882
ans = -12.84595601211006224344551434882 
ans = 2.2626424161863046178372248086765 %!!!
ans = -12.84595601211006224344551434882
ans = -12.84595601211006224344551434882
ans = -12.84595601211006224344551434882
ans = -12.84595601211006224344551434882
ans = -12.84595601211006224344551434882
...