Matlab Dirac Функция Syms Plot [дубликат]

Многие многочисленные дубликаты этого вопроса задают вопрос о влиянии округления с плавающей запятой на конкретные числа. На практике легче понять, как это работает, глядя на точные результаты вычислений, а не просто на чтение. Некоторые языки предоставляют способы сделать это - например, преобразование float или double в BigDecimal в Java.

Так как это вопрос, связанный с языком, ему нужны языковые агностические инструменты, такие как как Десятичный преобразование с плавающей запятой .

Применяя его к числам в вопросе, рассматриваемым как удваивает:

0,1 преобразуется в 0,1000000000000000055511151231257827021181583404541015625,

0,2 преобразуется в 0.200000000000000011102230246251565404236316680908203125,

0,3 конвертируется в 0,29999999999999999989897769753748434595763683319091796875 и

0,30000000000000004 преобразуется в 0,3000000000000000444089209850062616169452667236328125.

Добавление первых двух чисел вручную или в десятичный калькулятор, такой как Full Precision Calculator , показывает точную сумму фактических входов: 0.3000000000000000166533453693773481063544750213623046875.

Если округлить до эквивалента 0,3, ошибка округления будет 0.0000000000000000277555756156289135105907917022705078125. Округление до эквивалента 0,30000000000000004 также дает ошибку округления 0,0000000000000000277555756156289135105907917022705078125.

Возвращаясь к конвертеру с плавающей запятой, необработанный шестнадцатеричный показатель для 0.30000000000000004 равен 3fd3333333333334, который заканчивается четной цифрой и, следовательно, является правильным результатом.

2
задан Uygar Uçar 30 April 2016 в 12:51
поделиться

2 ответа

Как отмечали другие, дельта-функция Дирака не является истинной функцией, а обобщенной функцией . Справка для dirac указывает на это:

dirac (X) не является функцией в строгом смысле, а скорее распределением с int (dirac (xa) * f (x), - inf, inf) = f (a) и diff (тяжелый (x), x) = dirac (x).

Строго говоря, Matlab не может построить функцию дельта Дирака в нормальный путь, потому что часть его простирается до бесконечности. Однако, если вы хотите визуализировать, существует множество обходных решений. Простым является использование функции графика stem и оператора > для преобразования одного значения Inf в нечто конечное. Это дает единичную импульсную функцию (или Kronecker delta ):

t = -10:10;
x = dirac(t) > 0;
stem(t,x)

Если t и x уже существуют как символические переменные / выражения, а не числовые, которые вы можете использовать subs:

syms t
x = dirac(t);
t2 = -10:10;
x2 = subs(x,t,t2)>0;
stem(t2, x2)

Вы можете написать свою собственную сюжетную программу, если хотите что-то другое. Использование ezplot вряд ли будет работать, поскольку оно не обеспечивает столько контроля.

3
ответ дан horchler 24 August 2018 в 18:33
поделиться

Во-первых, я раньше не встречался ezplot; Я должен был прочитать об этом. Для вещей, которые являются функционалами, подобными вашим x, это удобно, но вам все равно нужно понять, что он точно дает вам то, что он обещает: сюжет.

Если бы у вас была работа по построению функции дельта дирака, как бы вы сделали это правильно? Вы не можете. Вы должны найти соглашение о аннотации вашего сюжета с информацией о том, что в вашем сюжете есть одиночная изолированная бесконечная точка.

Построение чего-то с графиком линии не подходит ни для чего, кроме smooth (это четко определенный член). Дельта Дирака определенно не входит в класс функций, которые являются гладкими. Вы обычно использовали бы вертикальную линию или что-то, чтобы обозначить точку, где ваш функционал не равен 0.

1
ответ дан Marcus Müller 24 August 2018 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: