• 締切済み

MATLABによるラグランジェ補間

下記1~2行目の8点が与えられていて、ラグランジェ補間を行う問題です。 下記のプログラムを自分で組んだものの、おかしな値が返ってきます。 どこが間違っているのか全く検討がつかないのでわかる方がいらっしゃったらどうかご教授お願いします。 x=[0,1.2,2.1,3.5,4.8,6.7,8.5,9.7]; y=[0.4,1.3,2.0,3.1,4.0,5.2,6.0,6.1]; x0=(0:0.001:15); h=0.0001; a=0; j=1; while a<=15 f(j)=0; for i=1:8 b=(lag(x(i)+h)-lag(x(i)))/h; f(j)=f(j)+lag(a)*y(i)/(b*(a-x(i))); end a=a+0.001; j=j+1; end plot(x0,f) [lag.m] function f=lag(x) g=1; z=[0,1.2,2.1,3.5,4.8,6.7,8.5,9.7]; for i=1:1:8 if x ~= z(i) g = g*(x-z(i)); end end f=g;

  • ttu34
  • お礼率100% (1/1)

みんなの回答

回答No.1

http://www12.plala.or.jp/ksp/computPhys/lag-hokan/index.html を参考に考えてみたのですが、ttu34 さんは上記の Web ページで示されて いる式とは違ったものを使っていますよね? なので、ttu34 さんの使っているラグランジェ補間の式がないとなんとも 言えないのですが。。。

ttu34
質問者

お礼

回答有難うございます! 補間関数の定義を勘違いしてプログラムを組んでいたようです↓ 定義を見直したら無事解決することができました。

関連するQ&A

  • 三次補間を使った近似値の求め方

    三次補間でf(x) = sinh(x)の近似を求めたいです。 f(0) = 0.0000、f(1) = 1.1752 f′(0) = 1.0000 、f′(1) = 1.15431 の値が与えられている状態です。 この場合、f(0.5)は三次補間(cubic interpolation)の求め方はこれで正しいのでしょうか? p(x_i) = y_iとp(x_i + h) = y_i + h*y_i'より f(0.5) = f(0+0.5) = y_0 + (0.5)*y_0' = 0.000 + 0.5*1.000 = 0.5 よってf(0.5) = 0.5 補間の手法が沢山あって少しこんがらがっています。 ただ、sinh(0.5) =0.522・・・なので有っていそうなのですが 間違っていたら教えてください><お願いします><

  • MATLAB

    matlabで for x=1:10 for y=1:10 for z=1:10 f=2*x+3*y-4*z; end end end のようなプログラムで、最大のときのfの値と、そのときのx,y,zの値を表示させるにはどのように書けばいいでしょうか?

  • MATLABの質問です。

    MATLABについての質問です。 大学の研究していてMATLABでわからないところがあるのでぜひ教えて頂けたらと思っています。 よろしくお願い致します。 現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求めるところまでできています。その後、全経路からダイクストラの方法で最短折れ線経路を求めたいのですがどのようにプログラムを持っていけばいいか分からず手詰まりしました。 ぜひご指導いただけますでしょうか。 よろしくお願いいたします。 プログラムは動きます。 close all; clc; init=1; final=1000; %図形座標取得 figure(1) for loop=init:final [x,y] = ginput A=[x,y] if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 B{loop} =A else break end end % size(B{i},1) figure(2) for C=init:loop-1 B{C} fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); end [x,y] = ginput pb=[x,y] figure(3) for C=init:loop-1 fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); plot(pb(:,1),pb(:,2),'o');hold on axis([0,1,0,1]); end %図形の辺 k=0; for i=1:loop-1 for p=1:size(B{i},1) for q=p+1:size(B{i},1) k=k+1; obst(k,:) = [B{i}(p,:),B{i}(q,:)]; end end end Pall = pb(1, :); Pall = [Pall; cat(1, B{:})]; Pall = [Pall; pb(2, :)]; %全経路 k=0 for i=1:size(Pall,1) for j=i+1:size(Pall,1) k=k+1; path(k,:) = [Pall(i,:),Pall(j,:)]; point{k}=[i,j]; end end % 交差判定 H=0 for j=1:size(path,1) cflas=1 for i=1:size(obst,1) y1=((obst(i,1)-obst(i,3))*(path(j,2)-obst(i,2))+(obst(i,2)-obst(i,4))*(obst(i,1)-path(j,1))) y2=((obst(i,1)-obst(i,3))*(path(j,4)-obst(i,2))+(obst(i,2)-obst(i,4))*(obst(i,1)-path(j,3))) y3=((path(j,1)-path(j,3))*(obst(i,2)-path(j,2))+(path(j,2)-path(j,4))*(path(j,1)-obst(i,1))) y4=((path(j,1)-path(j,3))*(obst(i,4)-path(j,2))+(path(j,2)-path(j,4))*(path(j,1)-obst(i,3))) Y1=y1*y2 Y2=y3*y4 if Y1<0&&Y2<0 H=H+1 cflas=0 S{j}=[0,0,0,0] S1{j}=[0,0,0,0] end end if cflas==1 X=[path(j,1),path(j,3)]; Y=[path(j,2),path(j,4)]; Xa=[path(j,1),path(j,2)]; Yb=[path(j,3),path(j,4)]; S{j}=[X,Y] S1{j}=[Xa,Yb] plot(X,Y,'-');hold on end end barricade = length(B{1,1}); M=zeros %コストを計算 for k = 1:size(path,1) X1=S{k}(1,1); X2=S{k}(1,3); Y1=S{k}(1,2); Y2=S{k}(1,4); cost{k}=sqrt((X2-X1)^2+(Y2-Y1)^2) M(point{k}(1), point{k}(2) )=cost{k} % if cost{i}==0 % cost{i}=10 % end end M' g=cost{1} for j=1:size(obst,1)+1 if(cost{j}>cost{j+1}) g= cost{j+1} end end

  • 線形補間について教えてください。

    今手元にx、y、zの座標が140個分あるのですが、それをエクセルの散布図を使いグラフにしました。しかし、明らかにおかしな場所に座標がプロットされていたりするため、スプライン補間などを使いきれいにしたいと考えています。 インターネットなどで、線形補間について調べたのですが、表現が難しくなかなか理解できませんでした。 スプライン補間やラグランジェ補間、ニュートン補間など色々あるようですが、これらの違いは何なのでしょうか。どなたか簡単に教えてください。お願い致します。 また、エクセルを使ったスプライン補間のやり方も教えてくだされば幸いです。 よろしくお願いします。

  • ラグランジュの補間法のCプログラム

    昨日学校でラグランジュの補間法の問題をC言語のプログラムで解けという課題が出されました しかし、友達と相談してもよくわかりませんでした 課題は以下の問題です sin関数6点、(0.92+0.01x)、x=0,1,2,3,4,5を求めて、ラグランジュの方法でsin(0.923)を計算せよ ちなみに答えは、0.79742です 先生からサンプルのプログラムをもらいました 以下のサンプルプログラムを参考にして解いてくださいと言われたのですが、どうしても解けません すいませんが分かる方、よろしくお願いします #include <stdio.h> #include <math.h> #define N 6 //データ数 double x[N]={ 0.0,1.0,2.0,3.0,3.1,5.0}; //X座標 double y[N]={0.0,1.1,2.5,4.0,4.1,5.0}; //Y座標 double lagrange( double); int main() { double xx,yy; //補間計算 printf("XX\t\tYY\n"); for( xx=0.0; xx<=5.0; xx+=.2 ) { yy = lagrange( xx); printf("%8.2lf\t%8.2lf\n", xx, yy ); } return 0; } //補間サブルーチン double lagrange( double xx ) { double z[N]; double yy=0.0; int i,j; for( i=0; i<N; i++ ) { z[i] = 1.0; //係数計算 for( j=0; j<N; j++ ) if( i!=j ) z[i]*=(xx-x[j])/(x[i]-x[j]); //補間値計算 yy+=z[i]*y[i]; } return yy; } 上記はあくまでサンプルプログラムなので、中に入っている数値は適当です よろしくお願いします

  • 数値解析の補間多項式

    (1)nを1以上の整数とし,X0,X1,,,Xnを相異なるn+1個の標本点とする。R上の関数f,g,hにおいて、gはfをX0,X1,,,Xn-1で補間し(つまり,g(Xi)=f(Xi),i=0,1,2,,,,n-1となる)、hはfをX1,,,Xnで補間するとき、関数    g(X)+(X0ーX)/(Xn-X0)×{g(X)ーh(X)} は、fをX0,X1,,,Xnで補間することを示したのですが質問があります。 まず補間するということはどんな意味を持っているのでしょうか?そしてこの問題の但し書きとしてf,g,hは多項式とは限らないとあったのですがではどう考えたらよいのでしょうか?? 最終的にどのように証明していけばよいかアドバイスお願いします★

  • 円弧補間

    径補正を使用して円弧補間で仕上げ加工をします。 私は、φ100の場合 φ10のエンドミルで加工 原点は円の中心 D20=5.0 φ100/2=50 50/2=25 G90G41X25.Y25.F100D20 G3X0Y50.I-25. G3J-50. G3X-25.Y25.J-25. G1G40X0Y0 という考え方で加工を行っているのですが皆さんはどのようにされていますか? 以前φ8.15の穴加工で上記のような考え方でφ4のエンドミルでプログラムを組んだらエラーになってしましました、径補正の場合は移動距離が使用刃物の半径以上あればいいんですよね?不思議。

  • 論理回路 補間数

    ブール関数Fの補間数F’を求めよ。 1,F(x,y)=xy'+x'y 2,F(A,B,C,D,E) = (AB'+C)D' + E 3,F(x,y,z) = (x+y'+z)(x'+z')(x+y) という問題です。 加法標準形として解く問題かと思って真理値表を描いてみましたが糸口が見えませんでした。 教えて頂きたいです。

  • 擬似的な補間曲線の式を作りたい

    (x,y)=(a,b)、(c,d)、(e,f)、(g,h)、(i,j) という測定結果が与えられていて、 それぞれの点を補間曲線のようにスムースにつなげたいのですが、 擬似的に四則演算・累乗の演算子とSIN・COS・TAN・log・πのみを使い どうにかシンプルに1つの関数で表せないでしょうか? ちなみにxは時間でyは距離で速さを求める式を作りたいです。 最小二乗法等を使うと爆発的な長さの式になり、とてもじゃないですが実用的ではありません。 どなたか分かる方いらっしゃいましたらご教授・アドバイス等よろしくお願い致します。

  • 線形補間

    線形補間での求め方 問題文: 1.数値を読み込む 2.xを読み込む 3.x<x1 または x>xnならエラー 3.x1<x<i+1 となるiを見つける 4.補間公式でyを求める 5.結果をプリントする #include<stdio.h> float hokan(void); int xn[] = {0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75}; double yn[] = {0.000,0.087,0.173,0.258,0.342,0.422,0.500,0.573, 0.624,0.707,0.766,0.819,0.866,0.906,0.939,0.965}; int x=5; void main() { printf("y = %lf\n", hokan()); } float hokan(void) { int i; double y; if(x <0|| 75<= x){ printf("エラーです\n"); } else{ for(i=0; xn[i] < x; i++) y = (yn[i+1] - yn[i]) * (x - xn[i]) / (xn[i+1] - xn[i]) + yn[i]; return y; } } 数表を最初にxnとynで表記しています。 このプログラムで線形補間が行われてないそうなのですが・・ 何か誤りがある様でしたらどなたか教えてください。

専門家に質問してみよう