我正在相互绘制两个方程,我通过创建一个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
答案 0 :(得分: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
要查找交集,可以将函数定义为两个函数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
。
答案 1 :(得分: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