我通过创建一个2x100的数组和一个线性空间来绘制两个方程。我已经成功地绘制了曲线,但我不知道如何找到它们相交的(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

发布于 2016-11-02 21:11:56
因为你是在离散点上求值,所以你还没有达到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-02 21:34:35
低成本版本:
使用此方法,我只需查看交叉点之前/之后的最近点:
ind = find(diff([u(1,:)-u(2,:)]>0))
interx = c(ind);最佳选择(IMO)是使用此方法近似交点,然后使用@Steve's solution来确定更精确的解。
for i = 1:length(interx)
fzero(f_diff,interx(i))
endhttps://stackoverflow.com/questions/40380400
复制相似问题