
Вот такое вот у меня было лицо

Нужен алгоритм для решения програмным путём
Входные данные - 12 X|Y и 4 точки x1 x2 x3 x4.
var
s, s1, p, p1, xx, H, J1, a: real;
k, i, n, j, ii, e1, f1, n1: integer;
x, y, z, z1: array [1..50] of real;
begin
repeat
clrscr;
write('Vvedite kolichestvo tochek: ');
readln(n);
if n<=0 then
begin
writeln;
write('Vvodit nado polozhitelnoe chislo! Nazhmite Enter');
readln;
end;
until n>0;
writeln;
for i:=1 to n do
begin
Write('vvedite x',i,': '); Readln(x[i]);
Write('vvedite y',i,': '); Readln(y[i]);
writeln;
end;
write(' Vvedite x*:'); Readln(xx);
s:=y[1];
for i:=2 to n do
begin
p:=1; s1:=0;
for j:=1 to i do
begin
if j=i then
goto l;
p:=p*(xx-x[j]);
l:
p1:=1;
for k:=1 to i do
begin
if j<>k then
p1:=p1*(x[j]-x[k]);
end;
p1:=y[j]/p1; s1:=s1+p1;
end;
p:=p*s1; s:=s+p;
if j=i then
goto l;
p:=p*(xx-x[j]);
l:
if j=i then
goto l;
p:=p*(xx-x[j]);
l:
p1:=1;
if j<>i then p:=p*(xx-x[j]) else
p1:=1;
const
n=11;
const
x0: double= 0.01;
h: double= 0.05;
y: array[0..n]of double = (
0.99,
0.95,
0.91,
0.87,
0.84,
0.80,
0.77,
0.74,
0.71,
0.68,
0.65,
0.63
);
function Prod(t: double; k: integer): double; // t(t-1)...(t-k)
begin
if k=0 then Prod:=t else Prod:=t*Prod(t-1,k-1)
end;
function FinDif(k,i: integer): double; // finite difference
begin
if k=0 then FinDif:=y[i] else FinDif:=FinDif(k-1,i+1)-FinDif(k-1,i)
end;
function NewtonPol(x: double): double;
var
k: integer;
p,t,f: double;
begin
p:=y[0];
t:=(x-x0)/h;
f:=1;
for k:=1 to n do begin
f:=f*k;
p:=p+Prod(t,k-1)*FinDif(k,0)/f
end;
NewtonPol:=p
end;
begin
WriteLn(NewtonPol(0.492):8:5)
end.
Program Nyuton;
uses crt;
var
str: string;
s, s1, p, p1, xx, a: real;
k, i, n, j, ii, e1, f1, n1: integer;
x, y, z : array [1..50] of real;
begin
repeat
clrscr;
write('Vvedite kolichestvo tochek: ');
readln(n);
if n<=0 then
begin
writeln;
write('Vvodit nado polozhitelnoe chislo! Nazhmite Enter');
readln;
end;
until n>0;
writeln;
for i:=1 to n do
begin
Write('vvedite x',i,': '); Readln(x[i]);
Write('vvedite y',i,': '); Readln(y[i]);
writeln;
end;
write(' Vvedite x*:'); Readln(xx);
s:=y[1];
for i:=2 to n do
begin
p:=1; s1:=0;
for j:=1 to i do
begin
if j<>i then p:=p*(xx-x[j]);
p1:=1;
for k:=1 to i do
begin
if j<>k then
p1:=p1*(x[j]-x[k]);
end;
p1:=y[j]/p1; s1:=s1+p1;
end;
p:=p*s1; s:=s+p;
end;
writeln;
for i:=1 to n do
begin
writeln('X[',i,']',x[i]
4,' Y[',i,']',y[i]
4);
end;
write(' Otvet f(x*)=');
textcolor(18);
writeln(s:5:3);
writeln;
textcolor(15);
write(' Nazhmite Enter');
readln;
end
y: array[0..n]of double = (
0.99,
0.95,
0.91,
0.87,
0.84,
0.80,
0.77,
0.74,
0.71,
0.68,
0.65,
0.63
);
- ? Это твои "игрики". Я при наборе отрезал два знака в конце. Понимаешь? Добавь. Вот и все. В чем проблема? Ты меня начинаешь разочаровывать, бушмэночка..function FinDif(k,i: integer): double;
var
a,b: double;
begin
if k=0 then FinDif:=y[i] else begin
a:=FinDif(k-1,i+1);
b:=FinDif(k-1,i);
FinDif:=a-b
end
end;
Как ты понимаешь (надеюсь), в математику или алгоритм это не вносит никаких изменений. Но Турбо, видимо, плохо работает со стеком сопроцессора и переполняет его. Этот workaround спасает ситуацию (не знаю, насколько). Но лучше все-таки взять пергаментный свиток побольше, аккуратно переписать на него весь пакет ТурбоПаскаль, отнести его к самому большому баобабу в округе, дождаться новолуния и закопать его со всеми почестями, станцевав потом на этом месте sarabanda с бубном (или что там у вас полагается по погребальному обряду), а потом скачать FreePascal с http://FreePascal.org и зажить счастливо. Кстати, извиняюсь, Турбо, кажется, не умеет определять строку сбоя, FP умеет, забыл я уже все.. f:=f/k;
p:=p+f*Prod(t,k-1)*FinDif(k,0)
Это тоже не влияет на математику, но к компьютерным вычислениям относится более щадяще..