2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему На страницу 1, 2, 3  След.
 
 Как создать такую функцию спиралей Архимеда? Сжатие данных.
Сообщение19.11.2023, 17:16 
Аватара пользователя


07/02/22

11
Как сделать такую функцию? Подскажите как так сделать? Задумка такова у нас есть две спирали Архимеда, на каждой из которых отрезок одинакового N размера ввиде оси абсцисс, первая ищет числа на оси абсцисс, а вторая ищет число отклонения на количество градусов для каждой последующей итерации числа для первой спирали, чтобы получить нужное число в первой спирали. И когда первая спираль попадает на ось абсцисса в неё вносится отклонение на столько градусов сколько в той точке отрезка градусов в которую она попала на второй спирали Архимеда попадающей на ось абсцисс. То есть иными словами она просто отклоняется в противоположную сторону противоположной первой, и все мы получаем исходный код который может сжимать насколько угодно большое число данных. Оставлю https://www.desmos.com/calculator/qlihcrdvxr?lang=ru ссылку на редактор. и неизвестная переменная которая при вводе выдает определенную взаимозависимость двух спиралей которая в итоге выводит N количество чисел.

Условно это должно выглядеть так:

Первая спираль:
Изображение

Вторая спираль:
Изображение

 Профиль  
                  
 
 Re: Как создать такую функцию спиралей Архимеда?
Сообщение19.11.2023, 17:27 


17/10/16
4930
MakarovDs
Лично я ничего не понял. Изложено сумбурно.

 Профиль  
                  
 
 Re: Как создать такую функцию спиралей Архимеда?
Сообщение19.11.2023, 17:40 
Аватара пользователя


07/02/22

11
sergey zhukov в сообщении #1618793 писал(а):
MakarovDs
Лично я ничего не понял. Изложено сумбурно.


Ну у нас типа есть функция Архимеда r=sa\cdot\theta^{\frac{1}{n}} и определенные значения чисел например: s=0.33, b=-0.06, a=1, n=1.07 и вторая которая отрицательная, и нужно создать функцию которая найдет значения которые настроят траекторию движения спирали таким образом которая попадет на определенные введенные массив цифр к примеру [15, 20, 25, 30, 40] которые выдаст функция по введенному массиву чисел, и максимальной длине отрезка...

 Профиль  
                  
 
 Re: Как создать такую функцию спиралей Архимеда? Сжатие данных.
Сообщение19.11.2023, 18:22 
Заслуженный участник
Аватара пользователя


15/10/08
30/12/24
12599
Там которые, короче, константы, они типа определены в натуре должны быть. Эти значится значения, их подставить нафиг надо, что бы они того этого в смысле нашлись.

 Профиль  
                  
 
 Re: Как создать такую функцию спиралей Архимеда? Сжатие данных.
Сообщение19.11.2023, 18:23 


17/10/16
4930
MakarovDs
Ммм... Ну, я так понял, что у нас есть две спирали Архимеда, причем одна, видимо, закручена в одну сторону, а другая - в другую. Причем все их параметры $s$, $a$, $n$ уже нам заданы. Тогда непонятно, что там в них еще "настраивать"? Или эти параметры $s$, $a$, $n$ и нужно определить так, чтобы спираль пересекла луч $\theta=0$ в заданных точках?

 Профиль  
                  
 
 Re: Как создать такую функцию спиралей Архимеда? Сжатие данных.
Сообщение19.11.2023, 18:58 
Заслуженный участник
Аватара пользователя


23/07/08
10910
Crna Gora
Ключевые слова в названии темы — сжатие данных.
MakarovDs в сообщении #1618789 писал(а):
и все мы получаем исходный код который может сжимать насколько угодно большое число данных
Вы представляете, какие открываются перспективы?

 Профиль  
                  
 
 Re: Как создать такую функцию спиралей Архимеда? Сжатие данных.
Сообщение19.11.2023, 19:02 


27/08/16
10464
svv в сообщении #1618812 писал(а):
Вы представляете, какие открываются перспективы?
Вы первый, кто дочитал до этих перспектив. :lol:

 Профиль  
                  
 
 Re: Как создать такую функцию спиралей Архимеда? Сжатие данных.
Сообщение19.11.2023, 19:09 
Заслуженный участник
Аватара пользователя


23/07/08
10910
Crna Gora
realeugene
Отчаявшись что-то понять, читая с начала, я попробовал прочитать с конца. :-)

 Профиль  
                  
 
 Re: Как создать такую функцию спиралей Архимеда? Сжатие данных.
Сообщение19.11.2023, 21:46 
Аватара пользователя


07/02/22

11
sergey zhukov в сообщении #1618801 писал(а):
MakarovDs
Ммм... Ну, я так понял, что у нас есть две спирали Архимеда, причем одна, видимо, закручена в одну сторону, а другая - в другую. Причем все их параметры $s$, $a$, $n$ уже нам заданы. Тогда непонятно, что там в них еще "настраивать"? Или эти параметры $s$, $a$, $n$ и нужно определить так, чтобы спираль пересекла луч $\theta=0$ в заданных точках?

Да - именно! Создать такую функцию которая находит все эти числа $s$, $a$, $n$ где две спирали Архимеда, первая ищет числа, а вторая ищет отклонение для каждой последующей итерации числа, чтобы получить нужное число. И когда первая спираль попадает на ось абсцисс, она отклоняется на величину второй спирали Архимеда, попадающей на ось абсцисс. И остается только правильно установить взаимозависимость двух спиралей. А дальше просто конвертировать текст в числа - создать программу которая получает строку которую конвертирует на N - количество символов, и массив из N количества всех индексов в тексте этого символа, и дальше функция выдает массив с массивами N количества всех индексов каждого символа, написать 2 функции одна из которых получает массив с массивами N количества всех индексов каждого символа, и выдает значение переменной который при вводе во вторую функцию которая генерирует массив с массивами N количества элементов всех индексов каждого символа:
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
<div class="codetitle"><b>Код:</b></div><div class="codecontent">
from itertools import chain

text = """import random
g = random.randint(0,4)
if g == 0:
    print("Kotyk")
if g == 1:
    print("Motyk")   
if g == 2:
    print("Kotopes")     
if g == 3:
    print("Borbies")     
"""


def get_indexes(text):
    chars = tuple(set(text))
    indexes = []
    for char in chars:
        indexes.append([i for i, c in enumerate(text) if c == char])
    return sorted(indexes)
   
def get_text_from_symbol_and_index_arrays(symbols, indexes):
    result = ['' for _ in range(max(chain.from_iterable(indexes)) + 1)]
    for symbol, symbol_indexes in zip(symbols, indexes):
        for index in symbol_indexes:
            result[index] = symbol
    print(''.join(result))


symbols = sorted(tuple(set(text)))
indexes = get_indexes(text)
get_text_from_symbol_and_index_arrays(symbols, indexes) #Выведет

"""
 "(),.)012( 34.:.)012( =)012
1,BKMab3
d.4.::.Ke3....")
1,Bfg(,ikfb3
d.4.::.me3....")
1,Bfn(,ikfb....3
d.4.::.oe3....")
1,Bfg(,("prfb.....3
d.4.::.se3....")
1,Bft()y
prfb.....3"""



</div>

Правда у меня плохо получилось с исходным кодом, но потом эту идею додумаю.

 Профиль  
                  
 
 Re: Как создать такую функцию спиралей Архимеда? Сжатие данных.
Сообщение19.11.2023, 22:08 


17/10/16
4930
MakarovDs
Ну, не то, чтобы я все понял, конечно, но тем не менее вот такое соображение. Две спирали Архимеда имеют, вообще говоря, суммарно четыре независимых параметра (каждая спираль характеризуется начальным углом поворота и шагом витков). Этими четырьмя независимыми параметрами можно закодировать не более четырех других независимых параметров. Т.е. так можно закодировать последовательность из не более, чем четырех произвольных (независимых, т.е. не связанных функциональной зависимостью) чисел. Как это у вас согласуется со "сжатием сколь угодно большого числа данных"?

И еще: вы извините, но тут люди не занимались последнюю неделю применением спиралей Архимеда к сжатию данных, поэтому они слегка не в теме. Так на лету не схватывают, как вы. Вы постарайтесь яснее излагать идею. Можно даже эти спирали нарисовать для какого-нибудь конкретного случая "сжатия".

 Профиль  
                  
 
 Re: Как создать такую функцию спиралей Архимеда? Сжатие данных.
Сообщение20.11.2023, 07:57 
Аватара пользователя


07/02/22

11
sergey zhukov в сообщении #1618844 писал(а):
MakarovDs
Ну, не то, чтобы я все понял, конечно, но тем не менее вот такое соображение. Две спирали Архимеда имеют, вообще говоря, суммарно четыре независимых параметра (каждая спираль характеризуется начальным углом поворота и шагом витков). Этими четырьмя независимыми параметрами можно закодировать не более четырех других независимых параметров. Т.е. так можно закодировать последовательность из не более, чем четырех произвольных (независимых, т.е. не связанных функциональной зависимостью) чисел. Как это у вас согласуется со "сжатием сколь угодно большого числа данных"?

И еще: вы извините, но тут люди не занимались последнюю неделю применением спиралей Архимеда к сжатию данных, поэтому они слегка не в теме. Так на лету не схватывают, как вы. Вы постарайтесь яснее излагать идею. Можно даже эти спирали нарисовать для какого-нибудь конкретного случая "сжатия".

Короче я нашел ответ вот код:
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
<div class="codetitle"><b>Код:</b></div><div class="codecontent">import numpy as np
from scipy.optimize import fsolve

def archimedean_spirals(numbers, length):
    def equations(variables):
        s, b, n, a = variables
        theta = np.arange(0, 2 * np.pi, 2 * np.pi / length)
        r = s * a * theta ** (1 / n)
       
        # Первая спираль
        spiral_1 = np.round(r).astype(int)
       
        # Вторая спираль с учетом отклонений от первой спирали
        offset = np.zeros(length)
        for i in range(length):
            if spiral_1[i] in numbers:
                offset[i] = -offset[i-1] if i != 0 else -1
       
        spiral_2 = spiral_1 + offset
       
        # Уравнения для оптимизации
        eq1 = np.sum(np.isin(spiral_1, numbers)) - len(numbers)
        eq2 = np.sum(np.isin(spiral_2, numbers)) - len(numbers)

        return [eq1, eq2]

    initial_guess = [1, 1, 1, 1]  # Начальное приближение для переменных
    solution = fsolve(equations, initial_guess)

    return solution

# Пример использования
numbers = [2, 4, 6, 8, 10]  # Числа на оси абсцисс
length = len(numbers)  # Длина массива чисел

result = archimedean_spirals(numbers, length)
print("Результат:")
print("s =", result[0])
print("b =", result[1])
print("n =", result[2])
print("a =", result[3])

"""функцию на python где первой функции на вход подается массив с числами, и длина этого массива, в функции две спирали Архимеда, на каждой из которых отрезок одинакового N размера равного длине массива поданного на вход функции ввиде оси абсцисс, первая спираль ищет числа на оси абсцисс, а вторая ищет отклонения на количество градусов в сторону для каждой последующей итерации первой спирали чтобы получить нужное число в заданном на вход массиве. И когда первая спираль попадает на ось абсцисса в неё вносится отклонение в противоположную сторону противоположной первой. И функция находит и возвращает такое значение r=s * a * ϴ^(1/n) неизвестных значений переменных s, b, n, a которые настраивает взаимозависимость двух спиралей так что попадает во все те числа на оси абсцисс которые были поданы массивом чисел на вход."""
</div>

Эта функция использует библиотеки numpy и scipy для реализации вычислений и оптимизации. Внутри функции archimedean_spirals, используется функция equations, которая задает систему уравнений для оптимизации на основе спиралей Архимеда. Затем используется функция fsolve из scipy.optimize, чтобы найти значения переменных, при которых система уравнений будет равна нулю. Результатом функции являются найденные значения переменных s, b, n и a, которые представляют настройки для двух спиралей Архимеда, удовлетворяющие условию на попадание всех чисел массива на ось абсцисс.

И вторая функция на Python, которая принимает значения переменных s, b, n, a спирали Архимеда и возвращает массив чисел, найденных на оси абсцисс с помощью двух спиралей Архимеда.

код: [ скачать ] [ спрятать ]
Используется синтаксис Python
<div class="codetitle"><b>Код:</b></div><div class="codecontent">import numpy as np

def archimedean_spirals(s, b, n, a):
    length = 100  # Длина массива чисел, можно изменить по вашему усмотрению
   
    def archimedean_spiral(r, theta):
        return r * np.cos(theta), r * np.sin(theta)  # Функция для получения координат точек спирали

    theta = np.arange(0, 2 * np.pi, 2 * np.pi / length)
    r = s * a * theta ** (1 / n)
   
    # Первая спираль
    x1, y1 = archimedean_spiral(r, theta)

    # Вторая спираль с учетом отклонений от первой спирали
    offset = np.zeros(length)
    for i in range(1, length):
        if x1[i] in x1[:i]:
            offset[i] = -offset[i-1]  # Отклонение в противоположную сторону
       
    x2 = x1 + offset
    y2 = y1
   
    return x2

# Пример использования
s = 1
b = 1
n = 1
a = 1

result = archimedean_spirals(s, b, n, a)
print("Результат:")
print(result)</div>

В этой функции используется функция archimedean_spiral, которая принимает радиус r и угол theta и возвращает координаты точек спирали. Затем осуществляется вычисление координат точек для первой и второй спиралей Архимеда. При наличии повторяющихся значений координаты x в первой спирали, во вторую спираль вносятся отклонения в противоположном направлении для каждой последующей точки.

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

 Профиль  
                  
 
 Re: Как создать такую функцию спиралей Архимеда? Сжатие данных.
Сообщение20.11.2023, 08:11 
Заслуженный участник


20/08/14
11872
Россия, Москва
Сжать не проблема, хоть в один бит, Вы вот восстановить обратно попробуйте ...
А потом посчитайте размеры своих массивов (особенно индексов) по сравнению с размером входного текста. А то получится после сжатия больше чем до, будет конфуз ... :oops:

 Профиль  
                  
 
 Re: Как создать такую функцию спиралей Архимеда? Сжатие данных.
Сообщение20.11.2023, 16:03 


27/08/16
10464
Dmitriy40 в сообщении #1618881 писал(а):
Сжать не проблема, хоть в один бит
Я сожму до нуля бит!

 Профиль  
                  
 
 Re: Как создать такую функцию спиралей Архимеда? Сжатие данных.
Сообщение21.11.2023, 20:50 
Аватара пользователя


07/02/22

11
Хотя в принципе я подумал спирали Архимеда то даже и не нужны. Достаточно просто иметь отрезок N длины, и кривую тупо запульнуть на полярной системы координат и при каждой последующей итерации она будет на какое-то число градусов тета отклоняться типа массив и там есть значения отклонений при каждой последующей итерации расстояния кривой на которую она отклоняется [20%, -5%, etc...] на какое-то значение таким образом попадая на отрезке в нужные числа массива. И когда она заканчивается она начинается считать с начала массива, и всё вообще можно не париться в принципе... Самого количества чисел отклонений тета не так много нужно что-бы выстроить нужную траекторию.

 Профиль  
                  
 
 Re: Как создать такую функцию спиралей Архимеда? Сжатие данных.
Сообщение21.11.2023, 21:14 
Заслуженный участник


20/08/14
11872
Россия, Москва
Только не называйте это сжатием данных. Тем более произвольных!! Последнее точно невозможно, математически, доказывается в одну строчку, не позорьтесь.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 44 ]  На страницу 1, 2, 3  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group