swift - 用 Swift 求解方程组

标签 swift matrix

我想在 Swift 中复制“\”(反斜杠)运算符在 Matlab 中的作用。

本质上,它求解一组矩阵形式的方程并给出系数(解)。

矩阵 A 给出如下:

 1     0     0     0     0     0     0     0     0     0
 1     4     1     0     0     0     0     0     0     0
 0     1     4     1     0     0     0     0     0     0
 0     0     1     4     1     0     0     0     0     0
 0     0     0     1     4     1     0     0     0     0
 0     0     0     0     1     4     1     0     0     0
 0     0     0     0     0     1     4     1     0     0
 0     0     0     0     0     0     1     4     1     0
 0     0     0     0     0     0     0     1     4     1
 0     0     0     0     0     0     0     0     0     1 

矩阵 b 给出如下:

 0
-15
-15
-3
-3
45
-12
-6
 0
 0

Matlab 中的运算 cj = A\b 给出:

0
-2.9185
-3.3259
1.2220
-4.5620
14.0262
-6.5427
0.1447
-0.0362
0

如何在 Swift 中实现上述内容?

快速等效的矩阵/数组是:

let A = [[1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 4.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 4.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 1.0, 4.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 1.0, 4.0, 1.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 1.0, 4.0, 1.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 4.0, 1.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 4.0, 1.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 4.0, 1.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]]

let b = [0, -15, -15, -3, -3, 45, -12, -6, 0, 0]

任何帮助将不胜感激。

最佳答案

我对 MATLAB 不太了解,但 A\b 似乎返回 AX=B 的解。为此,您可以在 iOS/macOS 中的 LinearAlgebra 框架 (Accelerate.vecLib.LinearAlgebra) 中使用 la_solve

import Foundation
import Accelerate.vecLib.LinearAlgebra

let A: [Double] = [
    1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    1.0, 4.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 1.0, 4.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 1.0, 4.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 1.0, 4.0, 1.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 1.0, 4.0, 1.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 4.0, 1.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 4.0, 1.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 4.0, 1.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
let matA = la_matrix_from_double_buffer(A, 10, 10, 10, la_hint_t(LA_NO_HINT), la_attribute_t(LA_DEFAULT_ATTRIBUTES))

let b: [Double] = [
    0, -15, -15, -3, -3, 45, -12, -6, 0, 0
]
let vecB = la_matrix_from_double_buffer(b, 10, 1, 1, la_hint_t(LA_NO_HINT), la_attribute_t(LA_DEFAULT_ATTRIBUTES))

let vecCj = la_solve(matA, vecB)
var cj: [Double] = Array(repeating: 0.0, count: 10)

let status = la_matrix_to_double_buffer(&cj, 1, vecCj)
if status == la_status_t(LA_SUCCESS) {
    print(cj) //->[0.0, -2.9185349611542728, -3.3258601553829079, 1.2219755826859044, -4.5620421753607099, 14.026193118756936, -6.5427302996670358, 0.14472807991120964, -0.036182019977802411, 0.0]
} else {
    print("Failure: \(status)")
}

结果似乎与您的结果相同(除了精度之外)。

关于swift - 用 Swift 求解方程组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41526674/

相关文章:

c++ - 有没有办法将简单的矩阵转换为图形?

R - 如何用方阵的下三角替换非方阵的下三角?

ios - 无法构造“DepartmentDataDelegate”,因为它没有可访问的初始值设定项

ios - 为什么 UILongPressGestureRecognizer 返回两次

ios - 无法在模拟器 Xcode 10 中构建我的项目

ios - 从服务器格式化文本

ios - 如何保存用户选择的项目

java - 水平或垂直翻转位图图像

function - 查找表中元素的每个组合(Lua/伪代码)

java - 递归地改变矩阵中相同的数字