Matlab --- это в первую очередь язык для численных расчетов, а не символьных (точных) и вся символьная математика в Matlabe - от Maple'а. Поэтому удобнее пример Уилкинсона рассмотреть используя нативные типы данных: double и single.
Вначале генерируем по известным корням
сам многочлен:
Код:
>> f=poly(1:20)
f =
1.0e+019 *
Columns 1 through 10
0.0000 -0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000 -0.0000
Columns 11 through 20
0.0001 -0.0010 0.0063 -0.0311 0.1207 -0.3600 0.8038 -1.2871 1.3804 -0.8753
Column 21
0.2433
Теперь f содержит коэффициенты многочлена Уилкинсона.
Тип --- double (по умолчанию).
Ищем его корни:
Код:
>> roots(f)
ans =
20.0003
18.9981
18.0065
16.9875
16.0139
14.9920
13.9996
13.0046
11.9963
11.0012
10.0001
8.9997
8.0001
7.0000
6.0000
5.0000
4.0000
3.0000
2.0000
1.0000
Получили приемлемый результат.
Теперь используем тип данных single:
Код:
>> roots(single(f))
ans =
26.0799
23.7053 + 6.1759i
23.7053 - 6.1759i
18.0389 + 9.5030i
18.0389 - 9.5030i
18.8840
12.1943 + 9.1001i
12.1943 - 9.1001i
8.3585 + 6.7668i
8.3585 - 6.7668i
6.2693 + 4.3811i
6.2693 - 4.3811i
5.1498 + 2.5574i
5.1498 - 2.5574i
4.1587 + 1.3935i
4.1587 - 1.3935i
3.1438 + 0.2486i
3.1438 - 0.2486i
1.9989
1.0000
Никуда не годится