woaiwo 发表于 2013-6-17 20:00

解超越方程的前五阶特征根

求教:如何用matlab编程求频率方程cos(x)*cosh(x)=1的前五阶特征根?

米斯兰达 发表于 2013-6-18 18:26

本帖最后由 米斯兰达 于 2013-6-18 20:39 编辑

首先,注意到cos(x)和cosh(x)都是偶函数,所以,只考虑x在0到正无穷的情况即可。
可以使用fzero函数来求。s=fzero(f,x0) 其中,f为要求解的方程,需要改成f=0的形式,x0是迭代求解的初值,s为距离x0最近的解。
这里你要求5个解,所以要使用不同的x0值进行计算,可以用一个循环实现。

s=zeros(1,20);
for x0=0:20
s(1,x0+1)=fzero(@(x)cos(x)*cosh(x)-1,x0);
end

可以得到s =

Columns 1 through 10

         0    4.7300    4.7300    4.7300    4.7300    4.7300    4.7300    7.8532    7.8532    7.8532

Columns 11 through 20

   10.9956   10.9956   10.9956   14.1372   14.1372   14.1372   17.2788   17.2788   17.2788   20.4204

Column 21

   20.4204

于是前5个解就为4.7300, 7.8532, 10.9956, 14.1372, 17.2788
当然也可以直接用s1=unique(s)来看s中的不重复元素都有哪些

如果楼主对arrayfun函数熟悉的话,可以用将上面的代码写成
f=@(x)arrayfun(@(a)fzero(@(y)cos(y)*cosh(y)-1,a),x);
s=f(0:20)
也可以

woaiwo 发表于 2013-6-21 15:38

米斯兰达 发表于 2013-6-18 18:26 static/image/common/back.gif
首先,注意到cos(x)和cosh(x)都是偶函数,所以,只考虑x在0到正无穷的情况即可。
可以使用fzero函数来求。 ...

米斯兰达,你好。我想继续问一下,将解出来的根,比如说x=17.2788带入到式子cos(x)*cosh(x)中,并不等于1啊,这是怎么回事啊?感谢,十分感谢您给我的回答~~~

米斯兰达 发表于 2013-6-21 16:51

woaiwo 发表于 2013-6-21 15:38 static/image/common/back.gif
米斯兰达,你好。我想继续问一下,将解出来的根,比如说x=17.2788带入到式子cos(x)*cosh(x)中,并不等于1 ...

这个问题要考虑y=cos(x)*cosh(x)这个函数的性质,事实上,随着x的增大,y在其上升区间增加的是十分剧烈的(梯度甚大)。fzero只是用数值方法计算出某个根x0的近似解x0‘,当x稍微大一点时,对于y=cos(x)*cosh(x)这个函数,x0’与x0之间的微小差距将会导致巨大的误差。

我们在matlab中计算出前五个根,然后直接带回,得到的结果也不全为零:
Columns 1 through 5

                   0-0.000000015321078   0.000000608846307-0.000000533573186-0.000041313619192

Columns 6 through 9

   0.000011634027075-0.000199880334506-0.027403513014335   0.650833654081140

可以看出误差是越来越大了。解决这个问题,既然我们已经知道在17.278759657399480附近有一个根,可以将这个数用fzero反复迭代,以期可以更加接近真实值。

woaiwo 发表于 2013-6-27 10:26

米斯兰达 发表于 2013-6-21 16:51 static/image/common/back.gif
这个问题要考虑y=cos(x)*cosh(x)这个函数的性质,事实上,随着x的增大,y在其上升区间增加的是十分剧烈的 ...

很感谢您的回复。不过如果认为您第一次求出的根的单位为度。那么进行单位换算之后再带回,即换成弧度,17.2788*pi/180,将这个数带回去,那么cos(x)*cosh(x)这个式子的值是很接近1的。我想问一下是不是和这个单位有关呢?
页: [1]
查看完整版本: 解超越方程的前五阶特征根