Обновить
0
@max7read⁠-⁠only

Пользователь

1
Подписчики
Отправить сообщение
1С — ERP? Не смешите мои тапочки. А когда MySQL прикрутят?
«нашей бухгатлерии» — опять свой «особый» путь. Знаю я что такое «наша бухгатлерия»: стоит дать пару раз каким-нибудь толстым руководством чего-нибудь вроде Excel по башке, тут же оно превращается в ERP. В общем у меня накипело, не будем дальше.
Именно так и будет — я свидетель.
>> быть де-факто бухгалтерским стандартом.
Это очень печально. Это даже хуже чем с виндой. MS хоть партнёрам даёт свой код. А эти… закрытое проприетарное, недостаточно (по-моему) документированное… ну дальше продолжите сами.
Я достаточно основательно изучил пародию на ВижалВасик от 1С, чтобы так говорить. Остальные аспекты 1С меня не колышат. При серьёзном подходе без «допиливания» нельзя использовать даже типовые конфигурации, не говоря уже о «самоделках». Решения для бизнеса с пародией ВижалВасика, нет спасибо, без меня (кому-то это возможно и к радости будет).
Буду считать 1С убогим г., пока они не прикрутят нормальные скриптовые языки, ну хотя бы javascript. Где есть javascript: mozilla rhino, браузеры, собственно на java можно заюзать, windows scripting, но только не на 1С, уг.
А я, наивный, думал что решения, в том числе и всякие численные. Ну, бывает, пойду подучу матчасть.
ekzo: как бы там ни было, я ему симпатизирую.
ekzo: и карма поползла вниз.

max7: я ему тоже симпатизирую.
max7: карма — детский сад.
При введении «бесконечно малого числа», ничего не обнуляется и не отбрасывается, так только с пределами так можно, и то не всегда. Например, как в дискретке с производящими ф., берём соответствующий коэффициент ряда при разложении. А «порядок малости» рассматривается как и для обычных чисел меньших единицы: d^n больше d^(n+1) — и всё. Также получается конкретная алгебраическая структура с прикольным числами z1=x1+y1*d, z2=x1+y1*d^2,… и z1>z2, ну и т.д. Просто чуть другим «языком» получается почти «дословно» матан, что не так круто, как «вообще другая» алгебра, по-моему.
Это не баг, это фича %D
И да, я понял где не догнал.
Видимо это моя проблема, но ух как мне не нравится эта nilpotent-ность при дифференцировании. Лучше вводить «бесконечно малое число».
А если ввести бесконечно малое число d, и далее как у вас. Результат будет тот же, так?
Ну всё, сдаюсь :) Я впервые анализировал код на Nemerle, это маленькое достижение.
А как с оптимизацией. Вот напишу я:

f(a: Dual): Dual { a*a+3.0/a }
f(a: double): double { f(Dual(a,0)).Real }
df(a: double): double { f(Dual(a,1)).Imaginary }

он мне при компиляции сократит до df(a: double): double { 2*a-3.0/(a^2) }?

«Занимаясь чем-то ненормальным вы рискуете нарваться на ненормального» — хабромудрость ;-).
Так, ну и кто мне минус влепил, а, признаёмся!!!
В том что это эмпирический метод, который срабатывает только для первой производной и всё. Его нельзя использовать для вычисления, например, второй производной по формуле f(x+d) = f(x) + f'(x)*d + f''(x)*(1/2)*d^2, нежно считать d^2 «невычислимой», а у вас d^2=0. Ни проще ли использовать общий метод с набором коэффициентов, а не вводить для вычисления n-ой производной n разных мегачисел.

Т.е. по аналогии с комплексными числами, кватернионами и т.д. Ввести числа компоненты которых будут соответствующими коэффициентами разложения Тейлора (Как в моем комменте выше). И определить для них операции (как в посте). При реализации используем свойство/определение производных f(n)(x) = (f(n-1)(x))', и реализуем операции для первой производной, а остальные определяем через неё рекурсивно. Т.е. так как у вас и сделано, но без эмпирических примочек, которые в общем неверны.
В коде используются соответствующие формулы дифференцирования относительно умножения и деления, по-моему, это очевидно и доказывать нечего.

И меня смущает деление, не проще ли написать:

Dual(a.real/b.real, ((a.imaginary*b.real)-(b.imaginary*a.real))/(b.real*b.real)).

Я упёртый и настайваю на своём.

И i^2 = -1, i^3=-i и можно «считать дальше», а d^2=0, d^3=0,...,d^n=0 и «облом дальше», вот.
Как эмпирический метод это конечно круто.

Но к комплексным числам это не имеет никакого отношения, даже по аналоги. Чисел (действительных) являющихся решением уравнения x^2 + 1 = 0 не существует, мы вводим «другие» числа, в которых оно имеет решение. Действительные и мнимые числа нигде не порождают противоречий, поэтому их можно использовать «совместно». Уравнение x^2 = 0 имеет решение в действительных числах x=0, при введении «дуальных» чисел оно имеет решение и в них x=d.

В коде, по-моему, (в том числе и для C++) видно, что нигде не применяется условие d^=0. «Просто» эмулируются символьные вычисления, т.е. не производится «умножение/сложение» на d, до этапа вычисление второго коэффициента в разложении Тейлора, т.е. первой производной, остальные просто игнорируются. И похоже у функциональных языков здесь явное преимущество именно в предварительной оптимизации, и как мне кажется, в данном случае, отсечение/сокращение лишних вычислений (шаблоны в C++ в таком применении выглядят как костыль).

Аналогичным методом можно ввести (n+1)-арные (раз эти дуальные) числа, т.е. не вычислять d, d^2, d^3,...,d^n, и соответственно получить n-ю производную (учитывая конечно дополнительные множители в коэффициентах).

n-арное число в данном рассмотрении по сути и есть набор коэффициентов разложения Тейлора. Т. е. коэффициентов при d^0, d^1, (1/2)*d^2, (1/6)*d^3,...,(1/(n!)*d^n.

Для константы a это будет: (a,0,0,...,0).
Для x: (x,1,0,0,...,0).
Для x^2: (x^2,2*x,2,0,0,...).
Для sin(x): (sin(x), cos(x),-sin(x),...).
И т.д.
По-моему, так и работают системы символьных вычислений.

В данном посте рассматриваются два первых коэффициента. И применяется «рекурсивное» вычисление n-ой производной. (А введение d^2=0, по-моему бред сивой кобылы).

В общем, спасибо за наводку, поразмышляю над этим на досуге.
Дополнение к предыдущему моему комменту.

n-арное число в данном рассмотрении по сути и есть набор коэффициентов разложения Тейлора. Т. е. коэффициентов при d^0, d^1, (1/2)*d^2, (1/6)*d^3,...,(1/(n!)*d^n.

Для константы a это будет: (a,0,0,...,0).
Для x: (x,1,0,0,...,0).
Для x^2: (x^2,2*x,2,0,0,...).
Для sin(x): (sin(x), cos(x),-sin(x),...).
И т.д.
По-моему, так и работают системы символьных вычислений.

В данном посте рассматриваются два первых коэффициента. И применяется «рекурсивное» вычисление n-ой производной. (А введение d^2=0, по-моему бред сивой кобылы).

В общем, спасибо за наводку, поразмышляю над этим на досуге.
Как эмпирический метод это конечно круто.

Но к комплексным числам это не имеет никакого отношения, даже по аналоги. Чисел (действительных) являющихся решением уравнения x^2 + 1 = 0 не существует, мы вводим «другие» числа, в которых оно имеет решение. Действительные и мнимые числа нигде не порождают противоречий, поэтому их можно использовать «совместно». Уравнение x^2 = 0 имеет решение в действительных числах x=0, при введении «дуальных» чисел оно имеет решение и в них x=d.

В коде, по-моему, (в том числе и для C++) видно, что нигде не применяется условие d^=0. «Просто» эмулируются символьные вычисления, т.е. не производится «умножение/сложение» на d, до этапа вычисление второго коэффициента в разложении Тейлора, т.е. первой производной, остальные просто игнорируются. И похоже у функциональных языков здесь явное преимущество именно в предварительной оптимизации, и как мне кажется, в данном случае, отсечение/сокрашение лишних вычислений (шаблоны в C++ в таком применении выглядят как костыль).

Аналогичным методом можно ввести (n+1)-арные (раз эти дуальные) числа, т.е. не вычислять d, d^2, d^3,...,d^n, и соответственно получить n-ю производную (учитывая конечно дополнительные множители в коэффициентах).

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность