2016-08-14 7 views
0

たとえば、f(x) = (4x^2-9)/(2x-3)としましょう。関数f(x)x=3/2で未定義です。この関数は因数分解してf(x)=2x+3を得ることができますが、最初の式を調べてみましょう。次のスクリプトx=1.5、機能f(x=1.5)=4.0浮動小数点問題に直面していますか?

clear all 
clc 

x = 0:0.3:2; 

for i = 1:length(x) 
if x(i) == 1.5 % this line for some reasons is ignored. 
    y(i) = 6; 
else 
    y(i) = (4*x(i)^2-9)/(2*x(i)-3); 
end 
end 
x 
y 

前スクリプトの出力に

x = 0   0.3000 0.6000 0.9000 1.2000 1.5000 1.8000 
y = 3.0000 3.6000 4.2000 4.8000 5.4000 4.0000 6.6000 

なぜy=4.0000x=1.5000ですか?今すぐ上記のコードの結果は

x = 0  0.3000 0.6000 0.9000 1.2000 1.5000 1.8000 
y = 3.6000 

f(x) 1つの値だけが存在している

clear all 
clc 
x = 0:0.3:2 
y = (4*x.^2-9)/(2*x-3) 

、のは、forループせずにコードを実行してみましょう。誰が何が起こっているのか説明できますか?

答えて

2

matrix division operator/を選択した、はい、あなたは、浮動小数点精度誤差に実行されています。あなたは、それが1.5と1.5であると思われるxの値の違いをチェックすることによってこれを確認することができます。その値が正確バイナリに保存することはできませんので、

x(6)-1.5 

%ans= 
%  -2.2204e-16 

は、具体的にあなたのケースではsee here for a deeper explanation

、ベクトルxを構築するために0.3を使用してから来て、次のいずれかが

x=0:3:20;  %Create the vector based on values that can be represented 
x=x/10; 

x=[0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8]; %Directly input the values 

abs(x(i)-1.5) < tol %Instead of directly comparing values, compare the difference to a determined tolerance (very small compared to the values at hand) 
あなたの問題を解決する必要があります

あなたの2番目の質問について@Phillはすでに回答を与えていますが、あなたは/の行列除算を使用しており、./要素の賢明な除算が必要です。

0

Octaveでforループを使用して最初の例を実行すると、無視されるx = 1.5 if文に問題はありません。おそらくこれはMatlabとOctaveの微妙な違いですが、私は驚いています。配列表記秒たとえば

clear all 
clc 
x = 0:0.3:2 
y = (4*x.^2-9)/(2*x-3) 

あなたはあなたの最初の質問については代わりにelement by element division operator./

関連する問題