Polynomial regression: Difference between revisions

Added Swift
(Rename Perl 6 -> Raku, alphabetize, minor clean-up)
(Added Swift)
Line 1,909:
_cons | 1 . . . . .
------------------------------------------------------------------------------</lang>
 
=={{header|Swift}}==
{{trans|Kotlin}}
<lang Swift>
 
let x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let y = [1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321]
 
func average(_ input: [Int]) -> Int {
return input.reduce(0, +) / input.count
}
 
func polyRegression(x: [Int], y: [Int]) {
let xm = average(x)
let ym = average(y)
let x2m = average(x.map { $0 * $0 })
let x3m = average(x.map { $0 * $0 * $0 })
let x4m = average(x.map { $0 * $0 * $0 * $0 })
let xym = average(zip(x,y).map { $0 * $1 })
let x2ym = average(zip(x,y).map { $0 * $0 * $1 })
 
let sxx = x2m - xm * xm
let sxy = xym - xm * ym
let sxx2 = x3m - xm * x2m
let sx2x2 = x4m - x2m * x2m
let sx2y = x2ym - x2m * ym
let b = (sxy * sx2x2 - sx2y * sxx2) / (sxx * sx2x2 - sxx2 * sxx2)
let c = (sx2y * sxx - sxy * sxx2) / (sxx * sx2x2 - sxx2 * sxx2)
let a = ym - b * xm - c * x2m
 
func abc(xx: Int) -> Int {
return (a + b * xx) + (c * xx * xx)
}
print("y = \(a) + \(b)x + \(c)x^2\n")
print(" Input Approximation")
print(" x y y1")
for i in 0 ..< x.count {
let result = Double(abc(xx: i))
print(String(format: "%2d %3d %5.1f", x[i], y[i], result))
}
}
 
polyRegression(x: x, y: y)
</lang>
 
{{out}}
<pre>
y = 1 + 2x + 3x^2
 
Input Approximation
x y y1
0 1 1.0
1 6 6.0
2 17 17.0
3 34 34.0
4 57 57.0
5 86 86.0
6 121 121.0
7 162 162.0
8 209 209.0
9 262 262.0
10 321 321.0
</pre>
 
=={{header|Tcl}}==