matlab - 如何找到 norm(a,2)==c 的唯一解;当 c 是标量且 a=[x abs(1/x);x+1 1/x]
问题描述
我正在尝试使用 Matlab 找到以下方程的唯一解
norm(a,2)=0.11
whenx
是一个变量并且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 = 空符号:0×1
任何有关解决上述方程的合适方法的帮助将不胜感激。
解决方案
我所知道的
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
函数的图:
更新
正如我们在上面看到的,求解器切换到数值求解器并只找到了一个解决方案,尽管该图向我们展示了至少两个可能的解决方案。
要找到所有解决方案(实际上可能有两个以上),我将直接使用数值求解器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
推荐阅读
- node.js - Firestore where 'IN' query on google-cloud firestore
- python - 在 pandas 中,如何识别具有共同值的记录并替换其中一个值以匹配另一个?
- python - 使用 scanpy 运行 paga 时出现 ModuleNotFoundError
- excel - .bat 文件在后台运行 excel 宏(或 .vbs 解决方案)
- pyspark - 使用 pyspark 将 unix_timestamp 转换为 utc_timestamp,unix_timestamp 不起作用
- ruby-on-rails - Ruby 可枚举块变量赋值
- javascript - 保持文件打开以进行读/写的最佳方法是什么?
- wordpress - ACF 自定义字段未显示在自定义分类模板上
- azure - 使用表格模型的 Power BI 中的行级别安全错误
- git - 如何将所有分支的存储库从 Bitbucket 复制到 CodeCommit 但没有历史记录?