MatLab——用二分法求f(x)=x-tan(x)的根
我已经在MatLab中为二分法算法编写了一个代码。我基于教科书中给出的伪代码。到目前为止,这个算法对我所有的问题都很有效,但是当我被要求在区间[1,2]上找到f(x)=x-tan(x)的根时,我遇到了一些麻烦。我的代码如下:MatLab——用二分法求f(x)=x-tan(x)的根,matlab,bisection,Matlab,Bisection,我已经在MatLab中为二分法算法编写了一个代码。我基于教科书中给出的伪代码。到目前为止,这个算法对我所有的问题都很有效,但是当我被要求在区间[1,2]上找到f(x)=x-tan(x)的根时,我遇到了一些麻烦。我的代码如下: function x = bisection(a,b,M) f = @(x) x - tan(x); u = f(a); v = f(b); e = b-a; x = [a, b, u, v] if (u > 0 && v > 0) || (u
function x = bisection(a,b,M)
f = @(x) x - tan(x);
u = f(a);
v = f(b);
e = b-a;
x = [a, b, u, v]
if (u > 0 && v > 0) || (u < 0 && v < 0)
return;
end;
for k = 1:M
e = e/2;
c = a + e;
w = f(c);
x = [k, c, w, e]
if (abs(e) < 10^(-5) || abs(w) < eps)
return;
end
if (w < 0 && u > 0) || (w > 0 && u < 0)
b = c;
v = w;
else
a = c;
u = w;
end
end
这显然是一个很大的偏差,因为我希望得到f(c)=0(上面向量中的第三个条目)
如果有人能就如何提高我的成绩给我任何帮助/提示,我将不胜感激。我对MatLab非常陌生,所以请把我当作新手:)。让我们看看由二分法生成的
c
序列:
c = 1.5000
c = 1.7500
c = 1.6250
c = 1.5625
c = 1.5938
c = 1.5781
c = 1.5703
c = 1.5742
c = 1.5723
c = 1.5713
c = 1.5708
c = 1.5706
c = 1.5707
c = 1.5707
c = 1.5708
您可以看到它收敛到pi/2
。tan()
在这一点上有一个奇点,x-tan(x)
。对分法收敛于这种奇异性,例如,也有人说过。这就是为什么f(c)
处的函数值不接近零的原因。事实上,它应该是无穷大
其他建议:
我喜欢你的二分法。要使其以更通用的方式使用,您可以合并以下更改:
- 使变量
成为函数参数。然后你可以用你的方法处理不同的问题 函数,而无需重新编写f
- 第一次分配
,但随后x=[a,b,u,v]
是 迭代。我会让这更一致x(1)
- 通过查看符号,您可以轻松测试
和f(a)
是否具有不同的符号 产品f(b)
。对于p=f(a)*f(b)
符号相等且没有根, 对于p>0
而言,符号不同,对于p<0
而言,p==0
或f(a)
为零,而 已经找到了根f(b)
c
序列:
c = 1.5000
c = 1.7500
c = 1.6250
c = 1.5625
c = 1.5938
c = 1.5781
c = 1.5703
c = 1.5742
c = 1.5723
c = 1.5713
c = 1.5708
c = 1.5706
c = 1.5707
c = 1.5707
c = 1.5708
您可以看到它收敛到pi/2
。tan()
在这一点上有一个奇点,x-tan(x)
。对分法收敛于这种奇异性,例如,也有人说过。这就是为什么f(c)
处的函数值不接近零的原因。事实上,它应该是无穷大
其他建议:
我喜欢你的二分法。要使其以更通用的方式使用,您可以合并以下更改:
- 使变量
成为函数参数。然后你可以用你的方法处理不同的问题 函数,而无需重新编写f
- 第一次分配
,但随后x=[a,b,u,v]
是 迭代。我会让这更一致x(1)
- 通过查看符号,您可以轻松测试
和f(a)
是否具有不同的符号 产品f(b)
。对于p=f(a)*f(b)
符号相等且没有根, 对于p>0
而言,符号不同,对于p<0
而言,p==0
或f(a)
为零,而 已经找到了根f(b)