2017-03-22 4 views
1

私はmatlabで実行するかどうかはわかりませんが、imは点、関数、lagrange aproximationをプロットする単純なラグランジュ多項式を実行しようとしていますので、私は以下を行いました不一致の引数lagrange多項式(オクターブ)

clear all 
clc 

function [y] = lagrange(x, x0, y0) 

    n = size(x0,1); 
    y = 0; 

    for i=1:n 
     p = 1; 
     for j=1:n 

      if j == i % avoiding division by 0 
       continue; 
      endif; 

      p *= (x-x0(j))/(x0(i)-x0(j)); 

     endfor; 

     y += y0(i) * p; 
    endfor; 
endfunction; 

x=[0:0.1:5]; 

x0=[2;2.75;4]; 
y0=[1/2;1/2.75;1/4]; 

y=lagrange(x,x0,y0); 

私は、「演算子*:不適合の引数(op1が1x41で、OP2は1x41)」次のような問題点を抱えている私は、たとえばしようとすると評価された場合のxにベクトルを使用している場合にのみ表示され、(3ラグランジュ、x0、y0)、関数は正しく動作し、問題はありません。問題は、xに大きなベクトルを使うときです。

S私の質問は、それは大きなベクトルxで動作するように関数を変更する方法があるか、関数に大きなベクトルを直接使用せずに関数をプロットできる方法があるかどうかです。

+0

エラーが発生する行を教えてください。私は、エラーメッセージがあなたに伝えるべきだと信じています。私の推測はそれが 'p * ='行で起こることです。不一致の議論が2つのものが同じサイズで問題を抱えるためには、行列乗算でなければならず、これはm×n×pである必要があります。 –

+0

ああ、はい、申し訳ありませんが、エラーは 'p * ='行にありました – Zigisfredo

答えて

1

p *= (x-x0(j))/(x0(i)-x0(j)); 

これ*は行列の乗算を意味し、1は、2つの行列(1、41)及び(1、41)を掛けることができない

p = p * (x-x0(j))/(x0(i)-x0(j)); 

を意味する:内寸が行います合わない。あなたは要素単位の乗算がある必要なもの

p = p .* (x-x0(j))/(x0(i)-x0(j)); 

(違いの説明についてはdocsを参照してください)。

それは

p .*= (x-x0(j))/(x0(i)-x0(j)); 

のように書くことができしかし、私は、このような収縮を避けることをお勧め。 Matlab/Octaveでは、2つのオペランドを並べて配置するとバイナリ演算の選択の誤りがより顕著になるため、他の言語のようにはあまり使用されません。

+0

あなたの答えに感謝します。興味深い。 – Zigisfredo

+0

私が要素単位の代入演算子がオクターブで文書化されていないと言うことができる限り。少なくとも私はオペレータのdocページでそれを確認していませんでしたが、簡単なテストでは説明したように動作することがわかります。そして私はMatlabがこれらの演算/代入演算子をまったくサポートしていないことはかなり確かです。 –

関連する問題