Thiele's interpolation formula: Difference between revisions

Content added Content deleted
(Completed restoration of formulae made invisible at 18:05, 31 July 2016 (one ρ character, and three π characters restored today))
m (→‎{{header|Sidef}}: updated code)
Line 1,039: Line 1,039:
{{trans|Python}}
{{trans|Python}}
<lang ruby>func thiele(x, y) {
<lang ruby>func thiele(x, y) {
var ρ = y.range.map {|i| [y[i]]*(y.len-i) }
var ρ = {|i| [y[i]]*(y.len-i) }.map(^y)
 

for i in ^(ρ.end) {
for i in ^(ρ.end) {
ρ[i][1] = ((x[i] - x[i+1]) / (ρ[i][0] - ρ[i+1][0]))
ρ[i][1] = ((x[i] - x[i+1]) / (ρ[i][0] - ρ[i+1][0]))
}
}
for i in range(2, ρ.end) {
for i (2 .. ρ.end) {
for j in range(0, ρ.end - i) {
for j (0 .. ρ.end-i) {
ρ[j][i] = (((x[j]-x[j+i]) / (ρ[j][i-1]-ρ[j+1][i-1])) + ρ[j+1][i-2])
ρ[j][i] = (((x[j]-x[j+i]) / (ρ[j][i-1]-ρ[j+1][i-1])) + ρ[j+1][i-2])
}
}
}
}
 

var ρ0 = ρ[0]
var ρ0 = ρ[0]
 

func t(xin) {
func t(xin) {
var a = 0
var a = 0
for i in range(ρ0.end, 2, -1) {
for i (ρ0.len ^.. 2) {
a = ((xin - x[i-1]) / (ρ0[i] - ρ0[i-2] + a))
a = ((xin - x[i-1]) / (ρ0[i] - ρ0[i-2] + a))
}
}
Line 1,061: Line 1,061:
return t
return t
}
}
 

# task 1: build 32 row trig table
# task 1: build 32 row trig table
var xVal = range(32).map { |k| k * 0.05 }
var xVal = {|k| k * 0.05 }.map(^32)
var tSin = xVal.map { .sin }
var tSin = xVal.map { .sin }
var tCos = xVal.map { .cos }
var tCos = xVal.map { .cos }
var tTan = xVal.map { .tan }
var tTan = xVal.map { .tan }
 

# task 2: define inverses
# task 2: define inverses
var iSin = thiele(tSin, xVal)
var iSin = thiele(tSin, xVal)
var iCos = thiele(tCos, xVal)
var iCos = thiele(tCos, xVal)
var iTan = thiele(tTan, xVal)
var iTan = thiele(tTan, xVal)
 

# task 3: demonstrate identities
# task 3: demonstrate identities
say 6*iSin(0.5)
say 6*iSin(0.5)
Line 1,079: Line 1,079:
{{out}}
{{out}}
<pre>
<pre>
3.14159265358979323846438729976818601771260734312
3.14159265358979323846438729976819
3.14159265358979323846157620314930763214337987744
3.14159265358979323846157620314931
3.14159265358979323846264318595256260456200366896
3.14159265358979323846264318595256
</pre>
</pre>