Ответы пользователя по тегу Математика
  • Как сравнить точность аналитического алгоритма и его программной реализации?

    @Andy_U
    Инсталируйте пакет mpmath, повторите ваш расчет с его использованием (задав там много-много знаков) и без и сравните результаты. Если формулы простые, это будет быстро. А потом, если грабли найдутся, ищите конкретные причины.
    Ответ написан
  • Существует ли обобщенный алгоритм поиска монотонной функции по трем точкам?

    @Andy_U
    Ну, на первый вопрос ответить просто. Кусочно линейная интерполяция удовлетворяет всем вашим указанным в вопросе требованиям :). А если таки учесть "дополнения и приложения", то надо на том из двух участков, где наклон прямой больше (пусть это будет, например, левый подинтервал), сделать интерполяцию функцией

    y = a+b*x+c*x**2

    такой что:

    1) Значение параболы в x1 равно y1
    2) Значение функции в x2 равно y2
    3) Производная функции в x2 равно наклону прямой в правом подинтервале.

    Доказывать мне лень, но кажется очевидным, что такая парабола будет монотонной на подинтервале.

    P.S. Если прямая на правом подинтервале не устраивает, ее можно тоже чуть изогнуть.

    P.P.S. Однако, такой (и любой подобный) алгоритм не даст решения для большего числа точек, поскольку первая производная будет иметь разрывы, которые Вас, как я понял, не устраивают. А при этом условии даже для четырех точек легко придумать пример, чтобы монотонность была, но обязательно с перегибом - взять 4 точки на S-образной кривой (две поближе к краям)... И как не крутись, без перегиба в центральной области не обойтись.
    Ответ написан
  • Как рассчитать среднеквадратичное отклонение, если среднее значение неизвестно?

    @Andy_U
    Если вы знаете количество чисел, их сумму и сумму их квадратов, то можете вычислить и среднее, и дисперсию. Любой учебник по мат.статистике и/или стат.обработке данных Вам поможет. Единственно, что надо следить за накоплением ошибок округления и возможным переполнением при суммировании.
    Ответ написан
  • Задача про стену и кирпичи. Как решить?

    @Andy_U
    Ну, я бы начал с решения уравнения в целых положительных числах 3*x+4*y=25. Решений две штуки: (x=3, y=4) и (x=7, y=1). Т.е. у нас 2 класса рядов. Вариантов расположения кирпичей в первом классе 7!/(3!*4!)=35, во втором классе 8!/(7!*1!)=8. Итого 35+8=43 вариантов ряда. Генерируем их. Теперь заполняем матрицу размером 43*43, ставя единички там, где ряды кирпичей (один в столбце, второй в колонке) совместимы с условием отсутствия общей вертикальной щели (для каждого варианта ряда строим множество {L[1], L[1]+L[2], ... L1+...L[N-1]}, потом очевидно, что ряды "совместимы", если пересечение множеств пустое). Это все быстро и памяти немного надо. На питоне - 30 строк. Кстати, в построенной матрице нулей сильно больше, чем единиц. несколько рядов просто ни с одним другим не совместимы. А потом, увы, перебор, если я правильно понял условие задачи. Типа как в классической задаче "поставить 8 ферзей на шахматную доску, чтобы они не били друг друга".

    Update:

    Код на питоне 3.4.3, решающий задачу перебором (кроме получения "классов" рядов), приведен ниже:

    import itertools
    
    
    def build_tail(height, row):
        if height == 9:
            return neighbours_number[row]
        else:
            return sum(build_tail(height+1, i) for i in acceptable_neighbours[row])
    
    
    rows = {i for i in itertools.permutations([3, 3, 3, 4, 4, 4, 4], 7)} | \
           {i for i in itertools.permutations([3, 3, 3, 3, 3, 3, 3, 4], 8)}
    
    acc_rows = [set(itertools.accumulate(row[: -1])) for row in rows]
    acceptable_neighbours = [[i for i, b in enumerate(acc_rows) if not (a & b)] for a in acc_rows] # copied from @bobrovskyserg
    neighbours_number = [len(i) for i in acceptable_neighbours]
    
    print(sum(build_tail(1, i) for i in range(0, len(acc_rows))))


    Время решения ~40 секунд, ответ bobrovskyserg подтверждаю. Пошел разбираться с его алгоритмом...
    Ответ написан