Chebyshev coefficients: Difference between revisions
Content added Content deleted
m (→{{header|Sidef}}: updated code) |
(Added XPL0 example.) |
||
Line 2,465: | Line 2,465: | ||
0.950 0.58168308946388 0.58168308946379 -8.992806E-014 |
0.950 0.58168308946388 0.58168308946379 -8.992806E-014 |
||
1.000 0.54030230586814 0.54030230586859 4.468648E-013</pre> |
1.000 0.54030230586814 0.54030230586859 4.468648E-013</pre> |
||
=={{header|Wren}}== |
=={{header|Wren}}== |
||
{{trans|Kotlin}} |
{{trans|Kotlin}} |
||
Line 2,554: | Line 2,555: | ||
0.950 0.58168309 0.58168309 -8.99e-14 |
0.950 0.58168309 0.58168309 -8.99e-14 |
||
1.000 0.54030231 0.54030231 4.47e-13 |
1.000 0.54030231 0.54030231 4.47e-13 |
||
</pre> |
|||
=={{header|XPL0}}== |
|||
{{trans|C}} |
|||
<syntaxhighlight lang "XPL0">include xpllib; \for Print and Pi |
|||
func real Map(X, MinX, MaxX, MinTo, MaxTo); |
|||
\Map X from range Min,Max to MinTo,MaxTo |
|||
real X, MinX, MaxX, MinTo, MaxTo; |
|||
return (X-MinX) / (MaxX-MinX) * (MaxTo-MinTo) + MinTo; |
|||
proc ChebCoef(N, Min, Max, Coef); |
|||
int N; real Min, Max, Coef; |
|||
int I, J; |
|||
real F; |
|||
[for I:= 0 to N-1 do Coef(I):= 0.0; |
|||
for I:= 0 to N-1 do |
|||
[F:= Cos(Map(Cos(Pi*(float(I)+0.5)/float(N)), -1.0, 1.0, Min, Max)) * |
|||
2.0/float(N); |
|||
for J:= 0 to N-1 do |
|||
Coef(J):= Coef(J) + F*Cos(Pi*float(J) * (float(I)+0.5) / float(N)); |
|||
]; |
|||
]; |
|||
func real ChebApprox(X, N, Min, Max, Coef); |
|||
real X; int N; real Min, Max, Coef; |
|||
real A, B, C, Res; |
|||
int I; |
|||
[A:= 1.0; |
|||
B:= Map(X, Min, Max, -1.0, 1.0); |
|||
Res:= Coef(0)/2.0 + Coef(1)*B; |
|||
X:= 2.0*B; |
|||
for I:= 2 to N-1 do |
|||
[C:= X*B - A; |
|||
Res:= Res + Coef(I)*C; |
|||
A:= B; |
|||
B:= C; |
|||
]; |
|||
return Res; |
|||
]; |
|||
def N=10, MinV=0.0, MaxV=1.0; |
|||
real C(N); |
|||
int I; |
|||
real X, F, Approx; |
|||
[ChebCoef(N, MinV, MaxV, C); |
|||
Print("Coefficients:\n"); |
|||
for I:= 0 to N-1 do |
|||
Print(" %2.15f\n", C(I)); |
|||
Print("\nApproximation:\n X Cos(X) Approx Diff\n"); |
|||
for I:= 0 to 20 do |
|||
[X:= Map(float(I), 0.0, 20.0, MinV, MaxV); |
|||
F:= Cos(X); |
|||
Approx:= ChebApprox(X, N, MinV, MaxV, C); |
|||
Print("%2.2f %2.14f %2.14f %0.1f\n", X, F, Approx, Approx-F); |
|||
]; |
|||
]</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
Coefficients: |
|||
1.647169475390310 |
|||
-0.232299371615172 |
|||
-0.053715114622048 |
|||
0.002458235266982 |
|||
0.000282119057434 |
|||
-0.000007722229156 |
|||
-0.000000589855646 |
|||
0.000000011521428 |
|||
0.000000000659630 |
|||
-0.000000000010022 |
|||
Approximation: |
|||
X Cos(X) Approx Diff |
|||
0.00 1.00000000000000 1.00000000000047 4.7E-013 |
|||
0.05 0.99875026039497 0.99875026039487 -9.4E-014 |
|||
0.10 0.99500416527803 0.99500416527849 4.6E-013 |
|||
0.15 0.98877107793604 0.98877107793599 -4.7E-014 |
|||
0.20 0.98006657784124 0.98006657784078 -4.6E-013 |
|||
0.25 0.96891242171064 0.96891242171041 -2.3E-013 |
|||
0.30 0.95533648912561 0.95533648912587 2.6E-013 |
|||
0.35 0.93937271284738 0.93937271284784 4.6E-013 |
|||
0.40 0.92106099400289 0.92106099400308 2.0E-013 |
|||
0.45 0.90044710235268 0.90044710235243 -2.5E-013 |
|||
0.50 0.87758256189037 0.87758256188991 -4.6E-013 |
|||
0.55 0.85252452205951 0.85252452205926 -2.5E-013 |
|||
0.60 0.82533561490968 0.82533561490987 2.0E-013 |
|||
0.65 0.79608379854906 0.79608379854951 4.5E-013 |
|||
0.70 0.76484218728449 0.76484218728474 2.5E-013 |
|||
0.75 0.73168886887382 0.73168886887359 -2.3E-013 |
|||
0.80 0.69670670934717 0.69670670934672 -4.5E-013 |
|||
0.85 0.65998314588498 0.65998314588494 -4.4E-014 |
|||
0.90 0.62160996827066 0.62160996827111 4.5E-013 |
|||
0.95 0.58168308946388 0.58168308946379 -9.0E-014 |
|||
1.00 0.54030230586814 0.54030230586859 4.5E-013 |
|||
</pre> |
</pre> |
||