0

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

要找到交集,您可以将函数定义为两个函数的差,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 回答