首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用array、linspace和IF查找交点

使用array、linspace和IF查找交点
EN

Stack Overflow用户
提问于 2016-11-02 20:50:12
回答 2查看 125关注 0票数 0

我通过创建一个2x100的数组和一个线性空间来绘制两个方程。我已经成功地绘制了曲线,但我不知道如何找到它们相交的(u和c)值?

我试过intersect(,)find(==),但它们不能解决我的问题,我想是因为它使用了一个if循环。

下面是我的代码:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2016-11-02 21:11:56

因为你是在离散点上求值,所以你还没有达到u_1==u_2的点。您可以看到它们最接近的点

代码语言:javascript
复制
>> [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更改符号时找到索引:

代码语言:javascript
复制
>> find(diff(sign(u(1,:)-u(2,:)))~=0)

ans =

     4    65

要找到交叉点,您可以将一个函数定义为两个函数f=u_1 - u_2的差值,并使用MATLAB函数fzero搜索根:您可以通过将原始函数定义为匿名函数来完成此操作:

代码语言:javascript
复制
>> 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

票数 2
EN

Stack Overflow用户

发布于 2016-11-02 21:34:35

低成本版本:

使用此方法,我只需查看交叉点之前/之后的最近点:

代码语言:javascript
复制
ind = find(diff([u(1,:)-u(2,:)]>0))
interx = c(ind);

最佳选择(IMO)是使用此方法近似交点,然后使用@Steve's solution来确定更精确的解。

代码语言:javascript
复制
for i = 1:length(interx)
fzero(f_diff,interx(i))
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40380400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档