如何在MATLAB中找到两个已知向量的未知算子A?
假设我有一个矩阵如何在MATLAB中找到两个已知向量的未知算子A?,matlab,matrix,vector,linear-algebra,solver,Matlab,Matrix,Vector,Linear Algebra,Solver,假设我有一个矩阵a,它有四个符号值a,b,c,d,其余为零。这些值的位置是已知的: sym a b c d A=[ab0;c0;0d0;0] (注意,我随机放置了这些符号。我处理的尺寸比这个大。) 现在假设我有两个向量x和y,它们是精确已知的。我想找到从x到y的a、b、c、d的值。具体地说,我想在MATLAB中求解等式A*x=y中的所有/任何A。这是如何做到的?解决方案1 使用符号 您需要以适当的语法为solve生成输入。实际上,您可以使用expr1==expr2创建一个“符号方程”,其中ex
a
,它有四个符号值a,b,c,d
,其余为零。这些值的位置是已知的:
sym a b c d
A=[ab0;c0;0d0;0]
(注意,我随机放置了这些符号。我处理的尺寸比这个大。)
现在假设我有两个向量
x
和y
,它们是精确已知的。我想找到从x到y的a、b、c、d的值。具体地说,我想在MATLAB中求解等式A*x=y
中的所有/任何A
。这是如何做到的?解决方案1
使用符号
您需要以适当的语法为solve
生成输入。实际上,您可以使用expr1==expr2
创建一个“符号方程”,其中expr1、expr2
是符号对象
比如说,
B=A*x;
eqn1 = B(1)==y(1);
方便地,您可以像B==y
那样生成符号数组。因此,您不必枚举B
的元素
解决方案2
首先用线性系统的适当形式表达你的问题。也就是说,将A*x
表示为x*[A;b;c;d]
,其中x
的元素是x
的元素之一
a、b、c、d……等的位置为您提供了添加到a的基础矩阵。例如,如果您从
A = sparse(4);
A(2,1) = c;
它只是意味着A*x
的第二个元素是包含x(1)*c
的和。由于c
是[a;b;c;d]
的第三个元素
X(2,3) = x(1);
由于从a、b、c、d……等位置开始,您应该能够直接分配X
的元素
然后,您可以使用常用的算法高效地查找X
的倒数,包括。如果您想要方便,inv(X)
应该可以工作
注意,根据A
的大小和未知数的数量,您的系统可能被低估或高估,解决方案可能存在,也可能不存在。您需要在两种解决方案中分别处理该问题
另请注意,对于将A*x
表示为x*[A;b;c;d]
的数学问题,上述提示对于SO中的问题已经足够了。你应该自己找个证据
请再次注意,如果希望提高效率,请避免在不需要的地方使用符号对象。(除非您需要进行符号积分,否则不需要符号对象。)您只需使用A*x.==y.
创建方程并求解该方程即可
%random (but determined) system of equation
syms a b c d
A = [c b 0 0;
a 0 0 0;
0 d 0 0;
0 0 c 0]
x = [1 2 3 4]
y = [1 2 3 4]
%create the equation
eqn = A*x.' == y.'
%solve the equation
res = solve(eqn)
但我不明白你为什么没有创建一个系数矩阵:
A = [0 2 1 0; % x is now useless because all the coefficient are contained in this matrix
1 0 0 0;
0 0 0 2;
0 0 3 0]
因此,现在您可以使用以下工具轻松解决系统问题:
A\y.'
这是用matlab方法求解一个确定的线性方程组
%random (but determined) system of equation
syms a b c d
A = [c b 0 0;
a 0 0 0;
0 d 0 0;
0 0 c 0]
x = [1 2 3 4]
y = [1 2 3 4]
%create the equation
eqn = A*x.' == y.'
%solve the equation
res = solve(eqn)
注意,您可以使用A=double(EquationToMatrix(A*x.))
将符号矩阵A
转换为系数矩阵A
我希望y(4)==0
,否则您的方程不正确。此外,只有x
的前两个值与您的方程相关,其他两个值可以忽略。@CrisLuengo这些只是样本值……在我的情况下,我知道有解决方案。我需要找到一种方法,在MATLAB中获得这些解决方案的列表。你知道吗?我的意思是你应该确保你给出的例子与你的实际问题相关。务必同时给出x
和y
,以提供一个完整的问题供某人解决。如果问题是完整的,就更容易给出答案。这只是一个过度确定的线性系统。请参见此处:。如果您想使用符号包(easy route),可以为solve
的输入生成代码,然后使用solve
。如果效率很重要——比如说规模很大,试着把A分解成它的因子,然后用数字来解决。这是一个奇怪的问题。大部分与编程无关。我只能提供一个关于Matlab函数的答案。