Witam potrzebuję pomocy w przerobieniu tego kodu na kod w Octave. Próbowałem coś sam działać ale funkcja nie zwraca tego co pascal.
function clampedsplinevalue (n : Integer;
x,f : vector;
f1x0,f1xn,xx : Extended;
var st : Integer) : Extended;
{---------------------------------------------------------------------------}
{ }
{ The function clampedsplinevalue calculates the value of the clamped }
{ cubic spline interpolant for a function given by its values at nodes and }
{ values of its derivative at the ends of interval. }
{ Data: }
{ n - number of interpolation nodes minus 1 (the nodes are numbered }
{ from 0 to n), }
{ x - an array containing the values of nodes, }
{ f - an array containing the values of function, }
{ f1x0 - a value of derivative at x[0], }
{ f1xn - a value of derivative at x[n], }
{ xx - the point at which the value of interpolating spline should }
{ be calculated. }
{ Result: }
{ clampedsplinevalue(n,x,f,f1x0,f1xn,xx,st) - the value of clamped }
{ spline at xx. }
{ Other parameters: }
{ st - a variable which within the function clampedsplinevalue is }
{ assigned the value of: }
{ 1, if n<1, }
{ 2, if there exist x[i] and x[j] (i<>j; i,j=0,1,...,n) such }
{ that x[i]=x[j], }
{ 3, if xx<x[0] or xx>x[n], }
{ 0, otherwise. }
{ Note: If st<>0, then clampedsplinevalue(n,x,f,xx,st) is not }
{ calculated. }
{ Unlocal identifiers: }
{ vector - a type identifier of extended array [q0..qn], where q0<=0 }
{ and qn>=n, }
{ vector1 - a type identifier of extended array [q0..qn1], where q0<=0 }
{ and qn1>=n-1, }
{ vector2 - a type identifier of extended array [q1..qn], where q1<=1 }
{ and qn>=n. }
{ }
{---------------------------------------------------------------------------}
var i,k : Integer;
u,y,z : Extended;
found : Boolean;
a : array [0..3] of Extended;
d : vector;
b : vector1;
c : vector2;
begin
if n<1
then st:=1
else if (xx<x[0]) or (xx>x[n])
then st:=3
else begin
st:=0;
i:=-1;
repeat
i:=i+1;
for k:=i+1 to n do
if x[i]=x[k]
then st:=2
until (i=n-1) or (st=2)
end;
if st=0
then begin
b[0]:=1;
u:=x[1]-x[0];
d[0]:=6*((f[1]-f[0])/u-f1x0)/u;
c[n]:=1;
u:=x[n]-x[n-1];
d[n]:=6*(f1xn-(f[n]-f[n-1])/u)/u;
for i:=1 to n-1 do
begin
z:=x[i];
y:=x[i+1]-z;
z:=z-x[i-1];
u:=f[i];
b[i]:=y/(y+z);
c[i]:=1-b[i];
d[i]:=6*((f[i+1]-u)/y-(u-f[i-1])/z)/(y+z)
end;
u:=2;
i:=-1;
y:=d[0]/u;
d[0]:=y;
repeat
i:=i+1;
z:=b[i]/u;
b[i]:=z;
u:=2-z*c[i+1];
y:=(d[i+1]-y*c[i+1])/u;
d[i+1]:=y
until i=n-1;
u:=d[n];
for i:=n-1 downto 0 do
begin
u:=d[i]-u*b[i];
d[i]:=u
end;
found:=False;
i:=-1;
repeat
i:=i+1;
if (xx>=x[i]) and (xx<=x[i+1])
then found:=True
until found;
y:=x[i+1]-x[i];
z:=d[i+1];
u:=d[i];
a[0]:=f[i];
a[1]:=(f[i+1]-f[i])/y-(2*u+z)*y/6;
a[2]:=u/2;
a[3]:=(z-u)/(6*y);
y:=a[3];
z:=xx-x[i];
for i:=2 downto 0 do
y:=y*z+a[i];
clampedsplinevalue:=y
end
end;
Kod w Octave
function y = foo(n, x, f, f1x0, f1xn, xx);
n = 6;
x=[17 20 23 24 25 27 27.7];
f=[4.5 7.0 6.1 5.6 5.8 5.2 4.1];
f1x0=3.0;
f1xn=-4.0;
xx=23.5;
if (n>1);
st=1;
elseif (xx < x(0)) or (xx > x(n))
then
st=3;
else
st=0;
i=-1;
while (i=n-1) or (st=2)
i=i+1;
for k=i+1:n
if x(i)=x(k)
then
st=2;
endif
endfor
endwhile
endif
if st=0;
b(0)=1;
u=x(1)-x(0);
d(0)=6*((f(1)-f(0))/u-f1x0)/u;
c(n)=1;
u=x(n)-x(n-1);
d(n)=6*(f1xn-(f(n)-f(n-1))/u)/u;
for i=1:n-1
z=x(i);
y=x(i+1)-z;
z=z-x(i-1);
u=f(i);
b(i)=y/(y+z);
c(i)=1-b(i);
d(i)=6*((f(i+1)-u)/y-(u-f(i-1))/z)/(y+z);
endfor
u=2;
i=-1;
y=d(0)/u;
d(0)=y;
while i=n-1
i=i+1;
z=b(i)/u;
b(i)=z;
u=2-z*c(i+1);
y=(d(i+1)-y*c(i+1))/u;
d(i+1)=y;
endwhile
u=d(n);
for i=n-1:0
u=d(i)-u*b(i);
d(i)=u;
endfor
g=0;
i=-1;
while g = 1;
if(xx=x(i)) and (xx<=x(x+1))
g=1;
endif
endwhile
y=x((i+1))-x(i);
z=d(0i+1);
u=d(i);
a(0)=f(i);
a(1)=(f(i+1)-f(i))/y-(2*u+z)*y/6;
a(2)=u/2;
a(3)=(z-u)/(6*y);
y=a(3);
z=xx-x(i);
for i=2:0
y=y*z+a(i);
endfor
endif
st
endfunction