Вычисление значения аргумента при помощи кубического сплайна и метода прогонки для таблично заданной функции
program Spline; uses crt; const n = 4; type arr = array[0..n] of real; var x, y, C: arr; {X, Y - vektory znachenii argumenta i funkcii} i: byte; {i - schetchik} Xx, spl, b, d: real; {b, d - koeff., uchastvuyushie v mnogochlene S(x)} h, F: arr; {h - vektor shagov (x[i] - x[i - 1]; F - vektor iz A*C=F} _a, _b, _c: arr; {diagonali trehdiagonal'noi matrici} alpha, betta: arr; {dlya metoda progonki}
begin clrscr; writeln('N = ', n); {} for i := 0 to n do begin write('x[', i, '] := '); readln(x[i]); write('y[', i, '] := '); readln(y[i]); writeln; end; write('Vvedite X: '); readln(Xx); {Xx - tochka gde nado naiti znachenie S(x)} {/} {sdelali vvod elementov}
for i := 1 to n do {nahodim shagi mezhdu x[i]} h[i] := x[i] - x[i - 1];
for i := 1 to n - 1 do {nahodim vektor F, A*X = F} F[i] := 6 * ( (y[i+1] - y[i])/h[i+1] - (y[i] - y[i-1])/h[i] );
{} for i := 1 to n - 1 do _b[i] := 2 * (h[i] + h[i+1]);
for i := 1 to n - 2 do _c[i] := - h[i + 1];
for i := 1 to n - 2 do _a[i] := - h[i]; {/} {zapolnili linii treh diagonalei}
{} alpha[1] := _c[1] / _b[1]; betta[1] := F[1] / _b[1]; for i := 2 to n - 1 do begin alpha[i] := _c[i] / (_b[i] - _a[i] * alpha[i - 1]); betta[i] := (F[i] + _a[i] * betta[i - 1]) / (_b[i] - _a[i] * alpha[i - 1]); end; {/} {pryamoi hod}
{} C[n] := 0; for i := n - 1 downto 1 do C[i] := alpha[i] * C[i + 1] + betta[i]; {/} {obratnii hod}
for i := 1 to n do {nashli nomer (i) otrezka, gde nahoditsya Xx} if x[i] >= Xx then break; {} d := (c[i] - c[i - 1]) / h[i]; {vichislyaem po formulam koeff} b := h[i]*C[i]/2 - h[i]*h[i]*d/6 + (y[i] - y[i-1])/h[i];
Эта задача из курса Численные методы - компьютерное моделирование. Сделать может быть проще и можно. Тут много недостатков. Можно, на мой взгляд, решение только усложнить. Главное - реализованы формулы метода прогонки для трехдиагональной матрицы.
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]