查找三阶ODE和一条线之间的交点?

时间:2011-02-07 23:32:19

标签: matlab intersection points ode

如何找到三阶ODE解与y = x的交点之间的交点?

我的ODE代码是

sol=dsolve('D3y-4*D2y+Dy+2*y=0,y(0)=-4,Dy(0)=-6,D2y(0)=-4')
x=0:2
y=subs(sol,'t',x)
plot(x,y)

1 个答案:

答案 0 :(得分:2)

要查找交叉点的数值:

创建一个匿名函数,在您的解决方案与您寻找的行之间的交叉点处为零:

sol = dsolve('D3y-4*D2y+Dy+2*y=0,y(0)=-4,Dy(0)=-6,D2y(0)=-4');
my_func = @(x) subs(sol,'t',x) - x; % Your solution - x is equal to zero at the %intersections

然后,如果你想以图形方式找到这些值:

plot(-5:.01:5,my_func(-5:.01:5))

或数字,通过优化例程:

x = fzero(my_func,0); % I find x = -.6847

将查找接近0的函数的零。它将找不到所有零,因此您需要在您期望交叉点的值附近启动fzero函数。

希望这有帮助,

安德鲁

编辑:如何进行二分法。

如果您不想使用优化方法来解决方程,我们的匿名一维函数“my_func”,但碰巧知道范围[range_ {min} range_ {max}],其中my_func = 0然后,如果您正在使用连续函数,则以下算法将为您找到函数的零:

range_min = 0; % say our range is [0 2]
range_max = 2;

error_tolerance = .0001; % will find the answer to within .0001

while (range_max - range_min < error_tolerance)
range_temp = (range_max + range_min)/2;
if ((my_func(range_temp) <0 & my_func(range_max)>0) | (my_func(range_temp) >0 & my_func(range_max)<0))
range_min = range_temp;

else if ((my_func(range_min)<0 & my_func(range_temp)>0) | (my_func(range_min)>0 & my_func(range_temp)<0))
    range_max = range_temp;

else if (my_func(range_temp == 0)
range_min = range_temp;
range_max = range_temp;

    end

end

t_intersection = (range_min + range_max)/2;

所以一些解释:如果函数是连续的,你的是,那么如果它在t_intersection处与y = t相交,那么在我们的修改函数中,my_func(t)= sol(t)-t在t_intersection处将为零。由于my_func是连续的,所以我们可以找到函数的零,只要我们知道函数的两个值,一个大于零,一个小于零。

因此,我们从这些已知点开始并定义范围[range_min range_max],其中my_func(range_min)&lt; 0和my_func(range_max)&gt; 0或反之亦然。然后我们通过创建中点range_temp = mean(range_min和_max)将此范围缩小一半。我们现在创建一个新范围[range_temp range_max]或[range_min range_temp],以便我们在范围内保留my_func的符号变化。我们重复这个过程,直到达到令人满意的准确度。

但有一点需要注意,这只会在您提供的初始范围内找到一个零。对于大多数零寻找方法而言,这是一个基本的挫折,更普遍的是优化领域,其中零查找可被视为特殊情况。

我认为这涵盖了它,祝你好运。

- 安德鲁