【问题标题】:How to numerically solve a system with two matrices in Matlab?如何在 Matlab 中数值求解具有两个矩阵的系统?
【发布时间】:2021-06-19 09:28:14
【问题描述】:

我试图以数字方式找到A*cos x +B*sin x = C 的解,其中 A 和 B 是两个已知大小相同的方阵(例如 100x100),C 是已知向量 (100x1)。 如果没有第二项(即使用单个矩阵),我将使用 Jacobi 或 Gauss-Seidel 来解决这个问题并得到 x 但在这里,我看不到如何在 Matlab 中继续解决这个问题。 可能是,解决问题会很有用:A*X + B*sqrt(1-X^2) = C

如果有任何帮助、想法或建议,我将不胜感激 提前致谢

【问题讨论】:

  • 问题A*X + B*Y = C 可以重写为[A,B]*[X;Y] = C,但这不允许您包含XY = sqrt(1-X^2) 之间已知的非线性关系。所以下面答案中的优化过程可能是最好的解决方案。

标签: matlab matrix system


【解决方案1】:

如果我理解正确,您可以像这样使用fsolvecX 是向量):

A = ones(2,2);
B = ones(2,2);
c = ones(2,1);

% initial point
x0 = ones(length(A), 1);
% call to fsolve
sol = fsolve(@(x) A * cos(x) + B*sin(x) - c, x0);

在这里,我们用F: R^N -> R^NF(x) = A * cos(x) + B*sin(x) - c 求解非线性方程组F(x) = 0

为了完整起见,这是我之前的回答,即如果CX 是矩阵而不是向量,该怎么做:

A = ones(2,2);
B = ones(2,2);
C = ones(2,2);

% initial point
x0 = ones(numel(A), 1);

% call to fsolve
fsolve(@(x) fun(x, A, B, C), x0)


function [y] = fun(x, A, B, C)
    % Transform the input vector x into a matrix
    X = reshape(x, size(A));
    % Evaluate the matrix equation
    Y = A * cos(X) + B*sin(X) - C;
    % flatten the matrix Y to a row vector y
    y = reshape(Y, [], 1);
end

这里的想法是将矩阵方程系统F: R^(N x N) -> R^(N x N)转换为等效的非线性系统F: R^(N*N) -> R^(N*N)

【讨论】:

  • 非常感谢您的 cmets,有效地使用 fsolve 可能是最佳选择。但是,为了确保很好地理解您的示例:C 是与 cos x 大小相同的向量,因此 C = one (2,1);最后在使用 fsolve 之后,向量 X 的给定解(对应于 y)是什么?
  • @Acosia 哎呀,我完全错过了 C 是向量而不是矩阵。所以我猜x 也是一个向量,对吧?在这种情况下,情况要容易得多,我将相应地编辑我的答案。我的回答假设 CX 是矩阵。
  • 没错,A和B是两个大小相同的矩阵,x和C是两个大小相同的向量(A、B、C都知道)。我非常感谢您的帮助。使用 fsolve 从大小为 100 x 100 的矩阵中获取 x 向量是否有任何问题?
  • @Acosia 我编辑了我的答案。 fsolve 的运行时间很大程度上取决于评估函数 F 所需的运行时间。在您的情况下,F 只需要计算两个矩阵向量乘积,与矩阵乘法相比,它们的计算成本更低。在这里,即使是 10000x10000 矩阵在现代硬件上也不应该成为问题。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 2012-12-15
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多