如何找到三阶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)
答案 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的符号变化。我们重复这个过程,直到达到令人满意的准确度。
但有一点需要注意,这只会在您提供的初始范围内找到一个零。对于大多数零寻找方法而言,这是一个基本的挫折,更普遍的是优化领域,其中零查找可被视为特殊情况。
我认为这涵盖了它,祝你好运。
- 安德鲁