LINUX.ORG.RU

Матан. Вероятность. Аналитическая геометрия

 


0

3

Приветствую!
Прошу помощи матан-совместимых девелоперов, хоть и не уверен, что по адресу.
Есть к примеру массив xy[1000,1000]
Есть функция распределения плотности вероятности P(x,y) представляющая собой к примеру поверхность Безье.
То есть условно можно сказать, что значение ячейки массива по адресу x,y буддет z=P(x,y)
Собственно вопрос:
Если известна функция распределения плотности вероятности P(x,y), то как (в общих чертах) реализовать функцию, возвращающую юзеру случайным образом пару x,y в соответствии с заданной функцией распределения плотности вероятности? Что почитать на эту тему?

★★★★★
Ответ на: комментарий от emulek

Я уже успел исправиться, а ты все еще цитируешь старое сообщение.

Как работать с комплексными токами и прочим я знаю. Деление на активный и реактивный - глупость.

Амплитуда тут вообще не при чём, ты её путаешь с эффектным напряжением(током).

Все равно не получается никакого деления на активный и реактивный ток.

Waterlaz ★★★★★
()
Ответ на: комментарий от emulek

Да, естественно обратная функция будет многозначной, если у исходной функции есть одинаковые значения. Ну и что? Например парабола x^2 имеет два значения, когда она равна 1. Обратная ессно двузначна при x==1. Ну например, если на твоей поверхности все точки с z образуют окружность R^2=x^2+y^2, то очевидно обратная функция в z будет многозначной, со значениями R^2=x^2+y^2. Как их «вернуть юзеру», и какой в этом физический смысл — ТСу виднее.

Какие в пень многозначные функции? О чем ты? ТС хочет генерировать двумерное распределение.

Waterlaz ★★★★★
()
Ответ на: комментарий от mashina

Чувак, тебя уносит с твоим вольным словоблудием и гуманитарными аналогиями непонятно куда.

чудак, что тебе показать? Как поверхность обратить? Ну на пальцах: на оси x лежит кастрюля. Дном вниз, как положено. Ось x идёт слева направо, ось y идёт от тебя куда-то вдаль. На ней тоже кастрюля лежит. Центр дна кастрюли в точке 0. Ось z идёт вверх. Кастрюля == твоя хитрая поверхность. Когда ты находишь точку (x,z), ты опускаешь из неё перпендикуляр точно вверх, и на пересечении с кастрюлей узнаёшь нужное z.

Решение задачи: повернуть кастрюлю вокруг оси y на 90 градусов по часовой стрелке. При этом ось z займёт место оси x. (а x -> -z). Тащем-то всё, задача решена. Единственная «беда», это форма кастрюли. Тут перпендикуляром не отделаешься, а нужна целая плоскость zz. Которая порежет кастрюлю поперёк пополам. Получится половинная кастрюля без ручек, и кольцо с ручками. Искомое множество (x,y) находится точно по линии разреза. Да, для кастрюли это окружность.

emulek
()
Ответ на: комментарий от Waterlaz

Деление на активный и реактивный - глупость.

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

Конечно можно и дифференциальное уравнение решить. Никто не против. Но закон Ома — проще. Смирись.

emulek
()
Ответ на: комментарий от Waterlaz

Какие в пень многозначные функции? О чем ты? ТС хочет генерировать двумерное распределение.

меня мало волнуют его хотелки. Условие выше. Пусть идёт доучиваться хотя-бы условие правильно записывать.

emulek
()
Ответ на: комментарий от emulek

блин, ты как-будто не читаешь, что я тебе пишу.

Я всецело _ЗА_ комплексные токи и напряжения.

Но вот есть у тебя комплексный ток I. Где тут активаная, а где реактивная состовляющая? Re(I) и Im(I)? Вот это как раз и есть глупость.

Waterlaz ★★★★★
()
Ответ на: комментарий от emulek

меня мало волнуют его хотелки. Условие выше. Пусть идёт доучиваться хотя-бы условие правильно записывать.

По-моему, ты страдаешь дислексией.

Прчитай еще раз вот это

Если известна функция распределения плотности вероятности P(x,y), то как (в общих чертах) реализовать функцию, возвращающую юзеру случайным образом пару x,y в соответствии с заданной функцией распределения плотности вероятности?

Какое из слов тебе не понятно?

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

По-моему, ты страдаешь дислексией.

а по моему — ты.

Тебе что-ли реализация непонятна? Ну так и скажи... Вот тебе простой вариант:

1. создаём массив на 1000000 точек, в каждом эл-те помещается одна точка (x,y) (т.е. массив структур complex например), и ещё z. O(1)

2. переносим нашу матрицу 1000х1000 в массив. O(N)

3. сортируем массив O(Nlog(N))

4. для поиска всех (z0..z1) ищем интервал в отсортированном массиве O(log(N))

конечно, это самый простой вариант. Дальше сам думай.

emulek
()
Ответ на: комментарий от Waterlaz

Но вот есть у тебя комплексный ток I. Где тут активаная, а где реактивная состовляющая? Re(I) и Im(I)? Вот это как раз и есть глупость.

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

А вот теперь смотри: ничего не включено. И ты включаешь в розетку конденсатор. Что происходит? Напряжение переменное, и конденсатор сначала будет заряжаться, затем разряжаться, и т.д. В цепи потечёт ток. Провода начнут греться. Но будешь-ли ты потреблять энергию? Нет. Т.е. ты будешь её потреблять когда напряжение возрастает, и твой конденсатор заряжаясь сопротивляется повышению. Когда же напряжение станет уменьшаться, конденсатор наоборот будет отдавать энергию, не давая уменьшаться напряжению.

Таким образом, ток в цепи есть, но расхода энергии нет(не считая потерь). Это тот самый чистый реактивный ток.

Фаза на твоём конденсаторе немного запаздывает. Т.е. когда на генераторе 0В, и когда напряжение повышается, на конденсаторе всего -1В Потому-что он сопротивляется повышению. А 1В теряется в проводах.

Индуктивность действует точно также, только сдвигает фазу вперёд. Ну и ещё её активное сопротивление 0 (в идеале).

Тут наверное сложность в том, что есть поток электричества (электронов), а есть поток энергии. Если нагрузка активная, то энергия всегда идёт от генератора к нагрузке. А если чисто реактивная, то полпериода туда, и полпериода сюда. Т.е. по сумме получается ноль. Но провода греются.

emulek
()
Ответ на: комментарий от emulek

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

Это глупость. Если у тебя есть резистор, а через него течет комплексный ток I такой, что Re(I)=0, он все равно выделяет тепло. Внезапно, да?

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

Waterlaz ★★★★★
()
Ответ на: комментарий от emulek

4. для поиска всех (z0..z1) ищем интервал в отсортированном массиве O(log(N))

Если у тебя в голове и есть какой-то алгоритм, то ты его тут не написал.

Какие еще нахрен (z0..z1)? ТС хочет генератор пар случайных чисел из некоторого распределения.

Waterlaz ★★★★★
()

Во многих случаях можно решить чисто аналитически :Ищешь функцию сечения. Ищешь функцию периметра сечения, переводишь ещё в параметрический вид. Профит. Лишбы существовали производные до нужного порядка.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Не обратил внимания - там меш кусками Безье. Тогда только изолинии, вычисление их общей длины, «бросать монетку» и отматывать. И проще и сложнее - по Безье изолинии сплайнами строить легко. Кода много :)

MKuznetsov ★★★★★
()
Ответ на: комментарий от emulek

считать (x,y) одним неделимым числом

Только для того алгоритма нужен линейный порядок над этими «числами». Какой?

anonymous
()
Ответ на: комментарий от af5

Там что-то написано, на счёт того, что функция должна быть исключительно возрастающей, если я правильно понял. И намёк на то, что обратные функции ищите сами где хотите =)

она у тебя будет монотонно возрастающей, так как твоя подинтегральная функция P(x,y) исключительно положительна.

dikiy ★★☆☆☆
()
Ответ на: комментарий от Waterlaz

Это глупость. Если у тебя есть резистор, а через него течет комплексный ток I такой, что Re(I)=0, он все равно выделяет тепло. Внезапно, да?

нет. Всё верно: течёт комплексный ток, и ты платишь деньги за тепло, которое рассеивает резистор.

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

Внезапно: весь ток активный. Его «активность» определяет НАГРУЗКА. Если нагрузка активная, то и ток через неё активный, и напряжение активное, и мощность. И за неё надо платить. И она светит и греет.

Если нагрузка реактивная, то за неё НЕ надо платить, она не светит и не греет, и ток на 146% реактивный.

Так понятно?

emulek
()
Ответ на: комментарий от Waterlaz

4. для поиска всех (z0..z1) ищем интервал в отсортированном массиве O(log(N))

Если у тебя в голове и есть какой-то алгоритм, то ты его тут не написал.

у меня в голове Over9000 алгоритмов поиска. Дихотомию возьми, это самое простое. Будут трудности в реализации — обращайся.

Какие еще нахрен (z0..z1)?

в условии z == плавующая точка. FP. Числа с плавающей точкой нельзя сравнивать на равенство. Запомни это. Почему? Да потому же, почему нельзя делить на ноль. Просто НЕЛЬЗЯ.

Потому я беру некий интервал (z0..z1).

Если речь идёт об идеальной математике, то ответ: нет, не существует. Не существует числа z такого, которое ТОЧНО равно другому числу z. В геометрической интерпретации: размер точки равен нулю. Следовательно, вероятность того, что точка z совпадает с другой точкой z равна строго и точно 0. Или по другому: между двумя любыми точками есть какое-то расстояние не равное нулю. Да, это противоречит тому, что между точкой z есть расстояние с самой точкой z. Потому операция деления на ноль внутренне противоречива, как и операция сравнения двух точек тогда, когда это одна и та же точка.

Короче: делить на ноль нельзя, и сравнивать FP на равенство тоже нельзя. Если не понимаешь, просто запомни.

ТС хочет генератор пар случайных чисел из некоторого распределения.

тоже дихотомия пойдёт. Т.е. берём интервал za=0,zb=maxz, делим его пополам. Если нужное z слева, берём левую половину, иначе правую. И опять пополам. До тех пор, пока не останется одна единственная точка. Для диапазона в 1048576 точек, нужно ровно 20 делений.

ЗЫЖ можно взять не массив из 1000000 точек, а массив из 1000000 указателей, т.к. массив с точками у нас уже есть, и если это сишечка, из указателя на точку, мы можем узнать не только z, но и (x,y).

emulek
()
Ответ на: комментарий от mashina

Как поверхность обратить?

заболел шизофренией - лечись!

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

Хотя... График (линию) функции x*x ты в состоянии обратить, и получить sqrt(x)? Ну а тут — не линия, а поверхность.

emulek
()
Ответ на: комментарий от anonymous

Только для того алгоритма нужен линейный порядок над этими «числами». Какой?

порядок задаёт значение z, у ТСа это P(x,y).

emulek
()
Ответ на: комментарий от emulek

Если мы эту поверхность пересечем плоскостью z=Z₀, получится кривая или даже набор кривых. Так что, нужно будет еще и придумать, как выбрать нужную точку. Предлагаю еще задать случайный азимут из центра тяжести сечения, а если луч с этим азимутом пересечет несколько точек, то еще и выбрать случайно индекс одной из них.

Anon
()
Ответ на: комментарий от Anon

Если мы эту поверхность пересечем плоскостью z=Z₀, получится кривая или даже набор кривых.

я в курсе. Пример с кастрюлей уже был выше.

И кстати, я не зря взял кастрюлю. Вот например в вике — чайник нарисован: http://ru.wikipedia.org/wiki/Поверхность_Безье

Если взять достаточно широкий интервал (z0,z1), который шире погрешности интерполяции, то мы получим точки сечения плоскостью z заданной поверхности. И судя по смыслу задачи, они ВСЕ нужны. Вот все и получаться.

В чём проблема?

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

не нужно. Все точки сечения равноправны по условию. Либо бери все, либо бери любую, равновероятную.

emulek
()
Ответ на: комментарий от emulek

да. Я шизофреник. А тебе слив засчитывать?

Сразу как ответишь на изначальный вопрос. Т.к. ты уже давно его забыл, напомню:

а какая разница, сколько размерностей? Просто вместо одномерного вектора используем многомерный. Это одно число, только из-за принятой записи (x,y) кажется, что их два. Но это не так — это точка. Даже если она в гиперпространстве со 100 измерениями.

И далее много околоматематического графоманства, типа

float тут не при чём. Их число тоже. Набор float'ов определяет ОДНО место в пространстве. Математики давно доказали эквивалентность мощностей множеств точек прямой и плоскости. И там и там их ровно алеф-1. Т.е. все точки на плоскости можно отобразить в прямую, и наоборот.

Есть ф-я плотности вероятности P(x,y) в (R,R). Ты хотел рассказать как сделать генератор случайных величин (float, float) методом сведения задачи к одной одномерной. Т.е. из ф-ии плотности P(x,y) нужно как-то сделать ф-ю распределения U(z).

mashina ★★★★★
()
Ответ на: комментарий от Anon

Это ты упоротый. Что тебе непонятно в сказанном?

Все понятно и все правильно, но упоротый же.

Waterlaz ★★★★★
()
Ответ на: комментарий от mashina

Есть ф-я плотности вероятности P(x,y) в (R,R). Ты хотел рассказать как сделать генератор случайных величин (float, float) методом сведения задачи к одной одномерной. Т.е. из ф-ии плотности P(x,y) нужно как-то сделать ф-ю распределения U(z).

под это условие подойдёт любая из найденных по моему методу точка. Вообще говоря, сколько надо брать точек — из условия непонятно. Это как обратная формула к квадрату числа: ясное дело, что получается 2 результата. Ты же не возмущаешься, когда калькулятор даёт тебе только одно решение? Так и тут: ответ я получил, юзай на здоровье.

Кстати говоря, в изначальном варианте задача не корректна: поверхность Безье совсем не обязана быть однозначно определена для (x,y), она может иметь сколько угодно значений z в данной точке. Но ТС почему-то считает, что значение одно, да ещё и всегда существует.

Это одно число, только из-за принятой записи (x,y) кажется, что их два.

так и есть — одно число (x,y) отображается в одно число z. Двухкомпонентность аргумента ни на что не влияет — вот arcsin(x) бесконечнозначная функция, хотя аргумент один. Ну и что?

emulek
()
Ответ на: комментарий от emulek

под это условие подойдёт любая из найденных по моему методу точка. Вообще говоря, сколько надо брать точек — из условия непонятно. Это как обратная формула к квадрату числа: ясное дело, что получается 2 результата. Ты же не возмущаешься, когда калькулятор даёт тебе только одно решение? Так и тут: ответ я получил, юзай на здоровье.

«У математиков»™ принято отвечать прямо на задаваемый вопрос. Немного помогу в этом непростом деле: есть ф-я плотности P(x,y), что с ней нужно далее делать?

mashina ★★★★★
()
Ответ на: комментарий от emulek

Прям таки P(x,y)? А не интеграл от неё?

anonymous
()

Допустим, что-то такое:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int gen(double* P, int n){
    double r = (double)rand()/(double)RAND_MAX;
    int a=0;
    int b=n-1;
    while(a<b-1){
        int c = (a+b)/2;
        if(P[c]<r) a=c; else b=c;
    }
    if(P[a]<r) return a+1;
    return a;
}

void p_into_P(double* p, int n){
    int i;
    for(i=1; i<n; i++)
        p[i]+=p[i-1];
}

int main(){
    srand(time(NULL));
    double p[2][2] = {{0.4, 0.1}, {0.1, 0.4}};
    p_into_P((double*)p, 4);
    int k = gen((double*)p, 4);
    printf("(%d, %d)\n", k/2, k%2);
}

Поля для улучшательств, оптимизаций и небыдлокода тут полно.

Waterlaz ★★★★★
()
Ответ на: комментарий от emulek

под это условие подойдёт любая из найденных по моему методу точка. Вообще говоря, сколько надо брать точек — из условия непонятно. Это как обратная формула к квадрату числа: ясное дело, что получается 2 результата. Ты же не возмущаешься, когда калькулятор даёт тебе только одно решение? Так и тут: ответ я получил, юзай на здоровье.

Я потому и пишу, что упоротый ты. Какие тут, блин, могу быть несколько точек? Какое из слов «генерировать случайно элемент из заданного распределения» тебе не понятно?

Waterlaz ★★★★★
()

Ужасающий: выбросить два целых числа [1, 1000], выбросить одно вещественное [0,1], если P(x,y) > p - тогда е(x,y) - искомая точка. Если P(x,y) < p перебросить все три.

Дискретный: если считать, что у нас просто 1000x1000 точек, разбить [0,1] на 1000x1000+1 интервал, где длина каждого - плотность вероятности P(x,y). Бросить один [0,1] - по интервалу, в который он попал, определить x,y.

Ну и нормальный: посчитать в каждой точке функцию распределения F(x,y) = \int_{-\infty}^x\int{-\infty}^y P(x,y)dxdy. Что по x, что по y это очевидно монотонно возрастающая функция, её можно обратить, тогда обратная даст отображения из реализаций равномерного распределения в исходное. В зависимости от методов численного интегрирования можно учитывать свойства поверхности.

aedeph_ ★★
()
Ответ на: комментарий от aedeph_

тогда обратная даст отображения из реализаций равномерного распределения в исходное.

у ф-ии распределения размерности больше 1 не существует обратной ф-ии в общем случае. В условиях топика её нет почти всегда.

mashina ★★★★★
()
Ответ на: комментарий от anonymous

Ты, вообще, знаешь что такое генератор случайных чисел?

нет. Расскажи.

emulek
()
Ответ на: комментарий от aedeph_

И что ты будешь делать с изолиниями? Или даже, как ты будешь их представлять? Множество пар (x, y) таких, что F(x, y) = c может иметь очень сложный вид даже при простых F(x, y)

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

Для достаточно гладкой поверхности - это будут гладкие кривые. Представлять обычными интерполяционными методами. Вычислить для кривой её линейную меру и по второму равномерному распределению вычислить точку на ней.

aedeph_ ★★
()
Ответ на: комментарий от aedeph_

Ты предлагаешь заранее построить множество изолиний

Waterlaz ★★★★★
()
Ответ на: комментарий от aedeph_

Отображения на изолинии не будет существовать? Это какие у автора условия?

Учишь математику вместе с осликом по книге электроника для собак? Отображение на ~ это не обратная ф-я.

Пусть даже построишь изолинии как ф-ю от p, всё равно не получится исходного распределения. Нужно ещё делать несколько нормировок. В сумме выходит на порядки сложнее по сравнению с прямым способом (ниже уже предлагали):

... нужна вероятность P(y) и P(x/y).

mashina ★★★★★
()
Ответ на: комментарий от mashina

А я про обратную функцию ничего и не говорил, это твои домыслы.

Пусть даже построишь изолинии как ф-ю от p, всё равно не получится исходного распределения.

В вашем ПТУ не проходят интегралов Лебега? Получится, без проблем.

В сумме выходит на порядки сложнее по сравнению с прямым способом (ниже уже предлагали):

Согласен, этот вариант лучше. Это решение как раз в стиле интеграла Римана.

aedeph_ ★★
()
Ответ на: комментарий от aedeph_

В вашем ПТУ не проходят интегралов Лебега? Получится, без проблем.

дам подсказку: не все изолинии имеют одинаковый вес (т.е. не равновероятны).

mashina ★★★★★
()
Последнее исправление: mashina (всего исправлений: 1)
Ответ на: комментарий от aedeph_

Если совсем упоротый, то рассмотри сам случай P(x,y) =1, F(x,y) = x*y для двух областей в [0,1)x[0,1): { F(x,y) < 0.5, F(x,y) >= 0.5}. Посчитай равномерность полученного распределения.

Метод генерации одномерной СВ по обратной ф-ии распределения не масштабируется на многомерный случай в прямом виде.

mashina ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.