2016-11-02 5 views
0

私は2つの方程式をお互いにプロットしています。私は2x100の配列とlinspaceを作成しました。私は曲線をうまくプロットしましたが、交差する値(uとcの値)を見つける方法がわかりません。array、linspace、IFを使って交点を見つける

私はintersect(,),find(==)を試しましたが、私の問題では動作しません。ifループを使用していると思います。ここで

は私のコードです:

clear all 
A = 3; 
B = 1.8; 
d = 1; 
c2 = 1; 
c1 = 0.7; 
s = 0.1; 

c = linspace(0,1.5); 
u = zeros(2,numel(c)); 

for i = 1:numel(c) 
u(1,i)= c(i)/((A/(c(i)+1))-(d*c(i)/(c(i)+c2))) ; 
u(2,i)= B*c(i) /(c(i)+c1)-s; 
end 

hold on 
plot(c,u(1,:),'r'); 
plot(c,u(2,:),'g'); 
hold off 

graph

+1

まず最初:あなたはここでループを必要としません: 'U(1、:)= C ./((A./(c+1))-(d*c./(c+ c2)))); u(2、:)= B * c ./(c + c1)-s; ' – obchardon

答えて

2

あなたは離散点で評価されているので、あなたはu_1==u_2ポイントをヒットしていません。

>> find(diff(sign(u(1,:)-u(2,:)))~=0) 

ans = 

    4 65 

を交差点を見つけるには、あなたのように関数を定義することができます:あなたはu_1-u_2変更が署名したときにインデックスを見つけることができ、彼らは

おそらく、もっと親切
>> [diff_min, diff_min_index] = min(abs(u(1,:)-u(2,:))) 

diff_min = 

    0.0046 


diff_min_index = 

    65 
>> hold on 
>> plot(c(diff_min_index),u(1,diff_min_index)) 
>> hold off 

と最も近いポイントを見ることができますあなたの二つの機能f=u_1 - u_2の違いとMATLAB関数fzeroを使用して根を検索: あなたは匿名関数として、あなたの本来の機能を定義することによってこれを行うことができます:

>> f1 = @(c) c./((A./(c+1)) - d*c./(c+c2)); 
>> f2 = @(c) B*c./(c+c1) - s; 
>> f_diff = @(c) f1(c) - f2(c); 
>> fzero(f_diff,0) 

ans = 

    0.0488 

>> fzero(f_diff,1) 

ans = 

    0.9729 

元の機能が利用できない場合はgriddedInterpolantを使用できます。

+0

ありがとうございます!私はそれらを機能させるというあなたの最後の提案を使用しました。非常に親切、あなたの時間をありがとう。 –

+0

@StefaniNotti問題はありません。喜んで助けてくれます。合格とマークすることを検討してください。 [ヘルプセンター>応答]ページ(http://stackoverflow.com/help/accepted-answer)で詳細を読むことができます。 – Steve

1

低コストのバージョン:私はちょうど交差点の後/前に最も近い地点で探しています。この方法では

ind = find(diff([u(1,:)-u(2,:)]>0)) 
interx = c(ind); 

最良の選択肢は、(IMO)は、このメソッドを使用することです交点を近似してから@ Steveの解答を使ってより正確な解を決定してください。

for i = 1:length(interx) 
fzero(f_diff,interx(i)) 
end 
+0

私はループとベスト*スタートの推測が好きです。あなたは '> 0'を持っているので、findに'〜= 0'は必要ありません。 (私は実際に 'find'を実際に使うのも当てはまります) – Steve

+0

@ Steve hoはい、私はそれを変更しました – obchardon

関連する問題