Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MATLAB中找到两个已知向量的未知算子A?_Matlab_Matrix_Vector_Linear Algebra_Solver - Fatal编程技术网

如何在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函数的答案。