0

2 つの方程式を互いにプロットしています。2x100 配列と linspace を作成してこれを行いました。曲線をうまくプロットできましたが、それらが交差する (u と c の) 値を見つける方法がわかりません。

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

グラフ

4

2 に答える 2

2

離散点で評価しているので、の点に達し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

u_1-u_2おそらくもっと役立つのは、符号が変わるときのインデックスを見つけることができることです。

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

ans =

     4    65

交点を見つけるには、関数を 2 つの関数の差として定義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

于 2016-11-02T13:11:56.217 に答える
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
于 2016-11-02T13:34:34.737 に答える