使用数组,linspace和IF查找交点

时间:2016-11-02 12:50:12

标签: arrays matlab coordinates intersection curves

我正在相互绘制两个方程,我通过创建一个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

graph

2 个答案:

答案 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