【问题标题】:unable to solve the following equations in MATLAB [closed]无法在 MATLAB 中求解以下方程 [关闭]
【发布时间】:2012-11-08 10:04:08
【问题描述】:

以下是我在matlab中写的一段代码,这里我想进行如下简单的数学运算[A][X]=[B],其中[X]是未知的。在我的情况下,我的 k 长度约为 1600000。所以我想要的只是获取数组中每个元素的 g1、g2 和 g3 的值。我已经尝试了以下

k31 = omega3./(d)      
k32 = omega3_2./(d)    
A   = [2,1,5;-2,-1,-5];    
X   = [g1;g2;g3];

for ii = 1:length(k31)    
    B = [k31(ii); k32(ii)];    
    X = pinv(A).*B;    
end

display(g1,g2,g3)

我使用的是伪逆,所以基本上我可以为每个 X 找到一个解决方案,并且我在那里进行了一些编辑......并且 x 是未知的,在数学上它可以完成,但我无法对其进行编码

另外我如何用 x 和 y 绘制 g1 g2 g3 的值,如下 scatter(x(1:end-1), y(1:end-1), 5, g1); scatter(x(1:end-1), y(1:end-1), 5, g2) 和 scatter(x(1:end-1), y(1:end-1), 5, g3)

【问题讨论】:

  • 发生了什么,或者没有发生什么?你没有提到结果和预期的结果。
  • 您的未知数 (3) 比等式 (2) 多。您要么需要找到另一个方程,要么进行最小二乘拟合。
  • 这段代码没有意义...A和最初的X根本不被使用...?此外,您在每次迭代时覆盖 X,使循环的结果基本上等于 X = pinv(R).*[k31(end); k32(end)];...?
  • @TimN:最小二乘拟合是最接近设计矩阵行空间的解。
  • 你不懂最小二乘法。它会为您提供代表使均方误差最小化的直线的值。

标签: matlab linear-equation


【解决方案1】:

我必须在这里做一些假设,所以请耐心等待。

我怀疑你想这样做:

k31 = omega3./(d)      
k32 = omega3_2./(d)    
A   = [2,1,5;-2,-1,-5];    

X = cell(length(k31),1);
for ii = 1:length(k31)            
    X{ii} = A\[k31(ii); k32(ii)];    
end

它使用反斜杠运算符而不是invpinv。键入help slash 以获取更多信息。

反斜杠运算符通常比invpinv 更快更准确。它也更加灵活——你的情况是不确定的(你有 1 个方程无法显式求解),在这种情况下,反斜杠运算符将为你找到一个最小二乘解。

注意我如何将所有结果保存在 cell-array X 中。这意味着 nth 解决方案将可以通过

访问
X{n}    % == [g1(n) g2(n) g3(n)]

【讨论】:

  • " 在这种情况下,反斜杠运算符将为您找到最小二乘解决方案。" - 完全正确。
  • @Rody Oldenhuis 我不明白。最后,我需要一个 g1、g2 和 g3 值的数组。我将用它来绘制一些数据。你能帮我搞定吗
  • @RohanChakrabarty:X 中的每个向量都是适合每个系统 Ax = [k31;k32] 的 3 元素最小二乘法。您可以通过发出X = [X{:}] 将其转换为普通数组,这将为您提供3-by-numel(k32) 解决方案矩阵。该矩阵的Nth 列是Nth 方程的最小二乘解。
  • @Rody 如果我这样做 A=[2,1,5;-2,-1,-5]; G=A[5;9] 我得到以下 G = 0 0 -0.4000 所以我无法理解为什么其他两个元素变为零
  • 当我执行以下操作时 A=[2,1,5;-2,-1,-5]; G=A[5;9] display(G) 我得到 G =[0;0;-0.4],所以我无法理解为什么前两个元素变为零
【解决方案2】:

在我看来,你最好从奇异值分解中创建一个伪逆。 Moore-Penrose 伪逆会起作用,但我认为它有时会给出一些奇怪的结果。最小二乘法可能不稳定,尤其是在您的示例矩阵的秩未满时。

还有;不要每次迭代都计算逆!

这是一个例子,其中处理了 A 的秩不足:

A   = [2,1,5;-2,-1,-5];

% pseudo inverse of A
[m,n]   = size(A);
% get SVD
[U,S,V] = svd(A);
% check rank
r       = rank(S);
SR      = S(1:r,1:r);
% make complete if rank is not full
SRc     = [SR^-1 zeros(r,m-r);zeros(n-r,r) zeros(n-r,m-r)];
% create inverse
A_inv   = V*SRc*U.';

X=[];    
for i = 1:1600
    % this actually takes most of the time
    k31 = rand(1000, 1);
    k32 = rand(1000, 1);
    B   = [k31';k32'];
    % X is overwritten on every loop...
    X   = [X A_inv*B];
end

N_xy = 1000;
x    = rand(N_xy,1);
y    = rand(N_xy,1);
g1   = X(1,1:N_xy);

figure(1), clf
scatter(x,y,5,g1)

我没有绘制所有 1600000 点,因为那不是你想要的

【讨论】:

  • thnx...让我试试...我做了以下 R=[2,1,5;-2,-1,-5];对于 ii = 1:length(k31) X{ii} = pinv(R)*[k31(ii); k32(ii)]; g1(ii)=X(1); g2(ii)=X(2); g3(ii)=X(3);然后我想做的就是为每个 g1 绘制如下 scatter(x(1:end-1), y(1:end-1), 5, g1);但我不明白...
  • 如何用 x 和 y 绘制 g1 g2 g3 的值,如下 scatter(x(1:end-1), y(1:end-1), 5, g1);
  • 好吧,您还没有解释 x 和 y 是什么,但请参阅我上面的编辑。我相信你明白你必须用你想做的任何事情来替换所有的兰特? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多