Guest User

Untitled

a guest
Oct 28th, 2025
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.90 KB | None | 0 0
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use utf8;
  5. use Math::BigRat;
  6.  
  7. # usage
  8. # perl Lagrange_form.pl 1,2 2,3 3,5 2.5
  9.  
  10. sub Lagrange {
  11.     my ($sets_ref, $x) = @_;
  12.     my @Z = @$sets_ref;
  13.     my $forms;
  14.  
  15.     for my $i (0..$#Z) {
  16.         my $form = 1;
  17.         for my $j (0..$#Z) {
  18.             next if $i == $j;
  19.             $form *= ($x - $Z[$j]->[0]) / ($Z[$i]->[0] - $Z[$j]->[0]);
  20.         }
  21.         $forms += $Z[$i]->[1] * $form;
  22.     }
  23.  
  24.     return sprintf "%f", $forms;
  25. }
  26.  
  27. # 多項式の係数を計算する
  28. sub LagrangeCoefficients {
  29.     my ($sets_ref) = @_;
  30.     my @Z = @$sets_ref;
  31.     my @coefficients = (0) x @Z;  # 多項式の係数を初期化
  32.  
  33.     for my $i (0..$#Z) {
  34.         my @term = (1);  # 現在の項を保持する配列(多項式の形式)
  35.         for my $j (0..$#Z) {
  36.             next if $i == $j;
  37.             my @new_term = (0);
  38.             for my $k (0..$#term) {
  39.                 $new_term[$k] += -$Z[$j]->[0] * $term[$k];
  40.                 $new_term[$k + 1] = $term[$k];
  41.             }
  42.             @term = map { $_ / ($Z[$i]->[0] - $Z[$j]->[0]) } @new_term;
  43.         }
  44.         for my $k (0..$#term) {
  45.             $coefficients[$k] += $term[$k] * $Z[$i]->[1];
  46.         }
  47.     }
  48.  
  49.     return @coefficients;
  50. }
  51.  
  52. # コマンドライン引数の処理
  53. my @args = @ARGV;
  54. die "Usage: perl your_script.pl x1,y1 x2,y2 ... x_n,y_n x_value\n" unless @args > 1;
  55.  
  56. # 最後の引数が求めたいx座標
  57. my $x_value = pop @args;
  58.  
  59. # 入力座標を有理数に変換
  60. my @points = map { [ map { Math::BigRat->new($_) } split /,/ ] } @args;
  61.  
  62. # ラグランジュ補間の計算と結果出力
  63. print "Interpolated value at x=$x_value: " . Lagrange(\@points, $x_value) . "\n";
  64.  
  65. # 多項式の係数を出力
  66. my @coefficients = LagrangeCoefficients(\@points);
  67. print "Polynomial coefficients (from highest to lowest degree):\n";
  68. print join(", ", @coefficients) . "\n";
  69.  
  70.  
Advertisement
Add Comment
Please, Sign In to add comment