1

パスカルで 3 次スプラインを計算するタスクがあります。私はプログラムのほとんどを完了しましたが、まだ質問があります。私の仕事は、関数 y = f(x) に対して、スプライン S1 と S2 を見つけ、さらに
delta1 = max|f(x)-S(x)|、delta2 = max|f'(x)-S1'(を見つけることです。 x)|、delta3 = max|f(x)-S2(x)|、delta4 = max|f'(x)-S2'(x)|

ここで S2 に役立つ式はどれですか?

これまでの私のコードは次のとおりです。

program spline_1_2;
uses crt;
const
k=1000;
var
input_file:text;
out1_file:text;
out2_file:text;
n,i:integer;
a_int,b_int,h:real;
delta_1, delta_2:real;
x, alpha, beta, y, a_coef, b_coef, c_coef, d_coef:array[0..k] of real;
S, S1, S2:array[0..k] of real;
A, B, C, F, z:array[0..k] of real;

Function f_given(x:real):real;
 begin
  f_given:=Cos((x*x)/3)-Exp(Sin(2*x));
 end;
Function f_prime(x:real):real;
 begin
  f_prime:=-Cos((x*x)/3)*(1/3)*2*x-Exp(Sin(2*x))*Cos(2*x)*2;
 end;

begin
clrscr;

Assign(input_file,'in.txt');
Reset(input_file);

Assign(out1_file,'out1.txt');
Rewrite(out1_file);

Assign(out2_file,'out2.txt');
Rewrite(out2_file);

while not EOF(input_file) do 
 begin
  readln(input_file,a_int,b_int);
  readln(input_file,h);
  readln(input_file,n);
end;  
 for i:=0 to n do
  begin
    x[i]:=a_int+(i-0.5)*h;
    f_given(x[i]); 
    y[i]:= f_given(x[i]);
    f_prime(x[i]);

   A[i]:= h;
  C[i]:= 4*h;
  B[i]:= h;

 end;

for i:=1 to n-1 do
begin 
 a_coef[i]:=y[i];
 F[i]:=((y[i+1]-2*y[i]+y[i-1])*3)/(h*h);
 A[1]:=0;
  C[n-1]:=0;
end;
alpha[1]:=-C[1]/B[1];
beta[1]:=F[1]/B[1];

  for i:=1 to n-1 do
 begin
  z[i]:=(A[i]*alpha[i-1] + C[i]);
   alpha[i]:= -B[i]/z[i];
  beta[i]:= ( F[i]-A[i]*beta[i-1])/z[i];
end;

c_coef[n-1]:=(F[i] - A[i] * beta[n-1])/(C[i] + A[i] * alpha[n-1]);

for i:=n-2 downto 1 do
begin
c_coef[i]:=alpha[i]*c_coef[i+1] + beta[i];
c_coef[0]:=0;
c_coef[n]:=0;

 end;



for i:=0 to n-1 do
 begin 
  d_coef[i]:=(c_coef[i+1]-c_coef[i])/(3*h);
 end;
  b_coef[0]:=f_prime(x[0]);
  b_coef[n-1]:=f_prime(x[n-1]);

for i:=1 to n-2 do
 begin 
   b_coef[i]:=(h/3)*(c_coef[i+1]+2*c_coef[i]) + (y[i+1] - y[i])/h;
 end;

 //our spline
for i:=1 to n do
 begin
   S[i]:= a_coef[i] + b_coef[i]*(x[i-1]-x[i]) + c_coef[i]*sqr(x[i-1]-x[i]) +    d_coef[i]*sqr(x[i-1]-x[i])*(x[i-1]-x[i]);
   S1[i]:=b_coef[i]+2*c_coef[i]*(x[i-1]-x[i])+3*d_coef[i]*(x[i-1]-x[i])*(x[i-1]-x[i]);
 end;

for i:=1 to n-1 do
 begin 
   Writeln(out1_file, x[i],'  ',y[i]:3:6,'  ',S[i]:3:6);
   delta_1:=abs(y[i]-S[i]);
   Writeln(out2_file,x[i],'  ',f_prime(x[i]):3:6,'  ', S1[i]:3:6);
   delta_2:=abs(f_prime(x[i])-S1[i]);
  end;
   Writeln(out1_file,'"delta1" = ',delta_1);
   Writeln(out2_file,'"delta2" = ',delta_2);
   Readln;  
 Close(input_file);
 Close(out1_file);
 Close(out2_file);
end.
4

1 に答える 1

0

おそらくすでに時代遅れですが、とにかく最初にいくつかの注意事項があります

1. f(x) があり、それから SPLINE を作成したいと考えていることは承知しています。

  • 1 つの 3 次曲線または複数の結合された SPLINE ?
  • S1,S2 の違いまたは意味は何ですか?
  • では、f(x) とは何ですか? f_given と f_prime はどちらですか?

2. SPLINE 計算の後、偏差を計算する必要があります

  • SPLINE と元の f(x) の間
  • そしてそれらの派生の間

3. 入力 (a、h、n) は何ですか?

  • a が x 間隔の開始であると仮定します
  • h はポイント間の x ステップ
  • n はサンプリングするポイントの数です

それを解決する方法:

1.スプラインを取得

  • 4点のf(x)から制御点を取得するだけです
  • SPLINE方程式を解いてSPLINE係数(a、b、c、d)を計算します
  • この後:

    t = < 0.0 , 1.0 >
    x = x0 + (x1-x0)*t
    y = a + b*t + c*t*t + d*t*t*t
    y'=     b   + c*t   + d*t*t   
    
  • ここで、x0、x1 は x の範囲です

  • t は SPLINE パラメータです。
  • 結合された SPLINE セグメントがさらにある場合は、各セグメントを個別に計算します
  • ポイントp0、p1、p2、...がある場合は、それらを適切に結合することを忘れないでください。
  • SPLINE 呼び出しシーケンスは

    p0,p0,p0,p1 // 3x p0 to ensure that SPLINE starts at point p0
    p0,p0,p1,p2
    p0,p1,p2,p3 // here continue normally 
    p1,p2,p3,p4
    p2,p3,p4,p5
    ...
    p5,p6,p7,p8
    p6,p7,p8,p9 // at the end the last point is also 3x
    p7,p8,p9,p9
    p8,p9,p9,p9
    

2.差異(偏差)を計算する

  • x = x0 .. x1 に対して行うだけです
  • 差を計算する
  • 最大の結果を保存する
于 2014-03-20T07:57:25.313 に答える