gpt4 book ai didi

swift - 用 Swift 求解方程组

转载 作者:行者123 更新时间:2023-11-30 10:27:04 27 4
gpt4 key购买 nike

我想在 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/59963816/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com