Здравствуйте!
Надо решить уравнение подобного вида 5*x1+7*x2+10*x3+...+50*xn = 2345789
Где количество неизвестных ~ 10-20.
И еще известно что сумма всех Х равна некоторому числу(обычно не больше 1000) .
Возможно еще(а скорее всего так и будет) нужно будет учесть
приблизительные "весовые коэффициенты" каждого Х.
Например, величина x1 должна быть примерно 30% от всей суммы,
x2 — 10% и т.п.
В институте учился уже давно поэтому забыл уже всю математику напрочь,
и кроме перебора на ум ничего не приходит.
Помогите с алгоритмом,
желательно бы еще и на С исходники посмотреть если есть конечно .
Спасибо.
Здравствуйте, alexs72, Вы писали:
A>Здравствуйте! A>Надо решить уравнение подобного вида 5*x1+7*x2+10*x3+...+50*xn = 2345789 A>Где количество неизвестных ~ 10-20. A>И еще известно что сумма всех Х равна некоторому числу(обычно не больше 1000) . A>Возможно еще(а скорее всего так и будет) нужно будет учесть A>приблизительные "весовые коэффициенты" каждого Х. A>Например, величина x1 должна быть примерно 30% от всей суммы, A>x2 — 10% и т.п.
То есть есть система из трех уравнений с 10 неизвестными. Насколько я знаю, для того, чтоб систему можно было решить, надо чтоб количество уравнений было больше или равно количеству неизвестных.
Здравствуйте, Mace, Вы писали:
M>Здравствуйте, alexs72, Вы писали:
A>>Здравствуйте! A>>Надо решить уравнение подобного вида 5*x1+7*x2+10*x3+...+50*xn = 2345789 A>>Где количество неизвестных ~ 10-20. A>>И еще известно что сумма всех Х равна некоторому числу(обычно не больше 1000) . A>>Возможно еще(а скорее всего так и будет) нужно будет учесть A>>приблизительные "весовые коэффициенты" каждого Х. A>>Например, величина x1 должна быть примерно 30% от всей суммы, A>>x2 — 10% и т.п. M>То есть есть система из трех уравнений с 10 неизвестными. Насколько я знаю, для того, чтоб систему можно было решить, надо чтоб количество уравнений было больше или равно количеству неизвестных.
По сути уравнение одно (первое), но для него будет множество решений.
Ограничением по Х выступает лишь сумма всех найденных X'ов (х всегда положительное).
И из этого полученного множества уже выберу по нужным критериям.
Вопрос как мне найти эти множества?
Здравствуйте, alexs72, Вы писали:
A>Здравствуйте! A>Надо решить уравнение подобного вида 5*x1+7*x2+10*x3+...+50*xn = 2345789 A>Где количество неизвестных ~ 10-20. A>И еще известно что сумма всех Х равна некоторому числу(обычно не больше 1000) . A>Возможно еще(а скорее всего так и будет) нужно будет учесть A>приблизительные "весовые коэффициенты" каждого Х. A>Например, величина x1 должна быть примерно 30% от всей суммы, A>x2 — 10% и т.п. A>В институте учился уже давно поэтому забыл уже всю математику напрочь, A>и кроме перебора на ум ничего не приходит. A>Помогите с алгоритмом, A>желательно бы еще и на С исходники посмотреть если есть конечно . A>Спасибо.
По сути у Вас система из двух уравнений
5*x1+7*x2+10*x3+...+50*xn = 2345789
x1+x2+x3+...+xn = X
Два линейных уравнения и n>2 неизвестных. Решений больше, чем надо -- целое n-2-мерное пространство.
Что это значит? Это значит, что Вы можете для n-2 переменных задать любые значения, подставить их в систему и найти подходящие значения для двух оставшихся переменных.
Теперь о весовых коэффициентах. Если у Вас их <=n-2, то можете смело задавать соответсвующие переменные так, что они в точности имеют необходимые весовые коэффициенты. Например, если x1 -- 30%, x2 -- 5%, ..., xn-2 -- 2%, а на xn-1 и xn ограничений нет, то задаете x1=0.3X, x2=0.05X и т.д. А xn-1 и xn находите из оставшейся системы 2x2.
Более интересный случай, когда у Вас есть желаемые весовые коэффициенты для всех n переменных.
Пусть желаемые весовые коэффициенты a1, a2, ..., an. Тогда среди всех этих бесчисленных решений надо найти то, которое дает наиболее близкие в каком-то смысле весовые коэффициенты. Мне думается, что лучше, когда они наиболее близкие в относительном, а не в абсолютном смысле. Т.е. если x1 должен быть, например, 30%, а x2 -- 3%, то лучшее решение должно давать одинаковое относительное отклонение от желаемого, а не абсолютное, т.е. 30%+-3% и 3%+-3% выглядит не очень, гораздо лучше, если 30%+-3%, 3%+-0.3%.
Тогда получаем следующую задачу
sum [i=1..n] ( xi/(ai*X) — 1 )^2 -> min
s.t.
sum [i=1..n] ci*xi = A
sum [i=1..n] xi = X
Если Вам надо решить ее один раз, то лучше воспользоваться каким-то матпакетом. Если же требуется программная реализация на каком-то языке, то для начала не мешало бы попробовать решить аналитически.
L = sum [i=1..n] ( xi/(ai*X) — 1 )^2 — l * (sum [i=1..n] ci*xi — A) — m * (sum [i=1..n] xi — X)
dL/dxi = 2 * ( xi/(ai*X) — 1 ) / (ai*X) — l * ci — m = 0
xi = ( l * ci + m ) * (ai*X)^2 / 2 + (ai*X)
Теперь все это подставляем в систему из двух линенейных уравнений
sum [i=1..n] ci*(( l * ci + m ) * (ai*X)^2 / 2 + (ai*X)) = A
sum [i=1..n] (( l * ci + m ) * (ai*X)^2 / 2 + (ai*X)) = X
l * sum[i=1..n](ci*ai*X)^2/2 + m * sum[i=1..n]ci*(ai*X)^2/2 = A — sum [i=1..n]ci*(ai*X)
l * sum[i=1..n]ci*(ai*X)^2/2 + m * sum[i=1..n](ai*X)^2/2 = X — sum [i=1..n](ai*X)
Это система из двух линейных уравнений. Выражаете m из первого, подставляете во второе, находите l, подставляете в первое, находите m, подставляете в выражения для xi выше.
Здравствуйте, vadimcher, Вы писали:
V>Здравствуйте, alexs72, Вы писали:
A>>Здравствуйте! A>>Надо решить уравнение подобного вида 5*x1+7*x2+10*x3+...+50*xn = 2345789
Да еще забыл сказать, что все Х должны быть целыми и положительными
Re: решение уравнения
От:
Аноним
Дата:
11.03.08 09:35
Оценка:
Здравствуйте, alexs72, Вы писали:
A>Здравствуйте! A>Надо решить уравнение подобного вида 5*x1+7*x2+10*x3+...+50*xn = 2345789 A>Где количество неизвестных ~ 10-20. A>И еще известно что сумма всех Х равна некоторому числу(обычно не больше 1000) . A>Возможно еще(а скорее всего так и будет) нужно будет учесть A>приблизительные "весовые коэффициенты" каждого Х. A>Например, величина x1 должна быть примерно 30% от всей суммы, A>x2 — 10% и т.п. A>В институте учился уже давно поэтому забыл уже всю математику напрочь, A>и кроме перебора на ум ничего не приходит. A>Помогите с алгоритмом, A>желательно бы еще и на С исходники посмотреть если есть конечно . A>Спасибо.
если есть неполная система линейных уравнений. например:
x1*a11+x2*a12+x3*a13+...+xn*a1n=b1
x1*a21+x2*a22+x3*a23+...+xn*a2n=b2
то решение системы можно записать в виде суперпозиции (суммы частных решений, не однородного и однородных)
x[]=xo+C1*xa[]+C2*xb[]+...C[n-2]*x(n-2)[]
Сначала задаёш все x3..xn=0 и находиш частное решение xo
xo1*a11+xo2*a12=b1
xo1*a21+xo2*a22=b2
Потом по очереди задаёш x3=1 x4=0 x5=0 ... xn=0
xa1*a11+xa2*a12=-1*a13
xa1*a21+xa2*a22=-1*a23
Потом по очереди задаёш x3=0 x4=0 x5=0 .. xk=1 ... xn=0
x(k)1*a11+x(k)2*a12=-1*a1k
x(k)1*a21+x(k)2*a22=-1*a2k
Получаеш набор дополнительных решений и общее решение зависит от n-2 произвольных констант которые можно выбирать из др условий.
x_full[]=xo+C1*xa[]+C2*xb[]+...C[n-2]*x(n-2)[]
ps: для решения такой системы за x1 и x2 лучше всего брать такие переменные для которых определитель по модулю максимален
|a11*a22-a21*a12| -> max
Здравствуйте, alexs72, Вы писали: A>>>Надо решить уравнение подобного вида 5*x1+7*x2+10*x3+...+50*xn = 2345789 A>Да еще забыл сказать, что все Х должны быть целыми и положительными
Это у нас линейное Диофантово уравнение. Обычные методы решения линейных уравнений к нему неприменимы. Википедия рекомендует расширенный Евклидов алгоритм. Ссылки на английские статьи, так как качество русской версии много хуже.
В общем, если погуглить diofantine equations, много всякого находится. Желаю успехов.
Здравствуйте, alexs72, Вы писали:
A>Здравствуйте, vadimcher, Вы писали:
V>>Здравствуйте, alexs72, Вы писали:
A>>>Здравствуйте! A>>>Надо решить уравнение подобного вида 5*x1+7*x2+10*x3+...+50*xn = 2345789 A>Да еще забыл сказать, что все Х должны быть целыми и положительными
Проблема в том, что даже для нецелочисленных решений у Вас могут быть серьезные отклонения от желаемых весов. Что уж тут говорить про целочисленные.
Можете проверить, что их сумма равна 100, а сумма с заданными коэффициентами -- 200.
Это НАИЛУЧШЕЕ решение в нецелых, которое дает наименьшее относительное отклонение от заданных весов.
Веса отклоняются достаточно сильно, но это лучшее решение в нецелых, если за критерий взять относительное отклонение весов от желаемых.
Например, если бы мы сразу положили x1=30, x2=15, x3=15 (т.е. в точности нужные веса), то x4+x5=40, 4x4+5x5=95, т.е. x5 = -65 и x4 = 105, т.е. результат ужасный, алгоритм дает намного лучше (хоть и далеко от желаемого).
Имея наилучший результат в нецелых, берем его как исходную точку для целочисленного решения. Если для Вас не так критично что x1+x2+...+xn=A и c1x1+c2x2+...+cnxn=X, т.е. эти равенства также могут выполняться с некоторой точностью (ну, например, если это память, то по сути Вам надо x1+x2+...+xn <= A, но как можно ближе), то стартуем от найденного лучшего решения в нецелых, и берем ближайшее подходящее целочисленное.
Здравствуйте, vadimcher, Вы писали:
V>Здравствуйте, alexs72, Вы писали:
A>>Здравствуйте, vadimcher, Вы писали:
V>>>Здравствуйте, alexs72, Вы писали:
A>>>>Здравствуйте! A>>>>Надо решить уравнение подобного вида 5*x1+7*x2+10*x3+...+50*xn = 2345789 A>>Да еще забыл сказать, что все Х должны быть целыми и положительными
V>Проблема в том, что даже для нецелочисленных решений у Вас могут быть серьезные отклонения от желаемых весов. Что уж тут говорить про целочисленные.
V>Имея наилучший результат в нецелых, берем его как исходную точку для целочисленного решения. Если для Вас не так критично что x1+x2+...+xn=A и c1x1+c2x2+...+cnxn=X, т.е. эти равенства также могут выполняться с некоторой точностью (ну, например, если это память, то по сути Вам надо x1+x2+...+xn <= A, но как можно ближе), то стартуем от найденного лучшего решения в нецелых, и берем ближайшее подходящее целочисленное.
Мне как раз важно чтобы х всегда были целыми, х=0.99999 никак не пойдет.
А вот ограничение на то что х1 должно быть 30% от всей суммы x,
скорее желательное чем обязательное, пусть будет и 31% и 32% или 90% на худой конец,
если по друому уравнение не решается.
Я бы даже пока на эти проценты закрыл глаза просто получить бы решение(набор решений)
с целыми значениями для Х
Thebeard написал еще про дифантово уравнение, если только мой мозг сможет это воспринять,
тем более на английском
Здравствуйте, alexs72, Вы писали:
A>Мне как раз важно чтобы х всегда были целыми, х=0.99999 никак не пойдет. A>А вот ограничение на то что х1 должно быть 30% от всей суммы x, A>скорее желательное чем обязательное, пусть будет и 31% и 32% или 90% на худой конец, A>если по друому уравнение не решается. A>Я бы даже пока на эти проценты закрыл глаза просто получить бы решение(набор решений) A>с целыми значениями для Х A>Thebeard написал еще про дифантово уравнение, если только мой мозг сможет это воспринять, A>тем более на английском
Как вам и посоветовал Thebeard — почитайте про диафантовы уравнения. Но я бы вам рекомендовал сначала почитать о методе Гаусса, о решении системы линейных уравнений здесь, так как в диафантовых уравнениях решение будет совершенно аналогичным, но с маленькой поправкой на допустимые преобразования.
Если вкратце, чтобы у вас была идея как все делать, то ее можно сформулировать так:
Если есть система линейных уравнений, то для нахождения ее решения методом Гаусса делают следующее:
— Пишут матрицу коэффициентов уравнения
— Приводят эту матрицу к диагональному виду, с помощью двух типов преобразований:
1) Можно переставлять любые две строки
2) Можно из одной строки вычесть другую, умноженную на любое число
Данные преобразования дают новые уравнения, но при этом решение старых уравнений и новых не изменяются. Зато в итоге приходим к системе уравнений, для которых решение очевидно.
В случае дифантовых уравнений, на коэффициенты налагается ограничение, что они являются целыми числами, а решение — тоже ищется в целых числах.
Для решения опять используется метод Гаусса, но условие 2 видоизменяется в
2') Можно из одной строки вычесть другую, умноженную на любое целое число
В итоге опять матрицу можно привести к диагональному виду, из которого легко получается решение
Здравствуйте, alexs72, Вы писали:
A>Мне как раз важно чтобы х всегда были целыми, х=0.99999 никак не пойдет. A>А вот ограничение на то что х1 должно быть 30% от всей суммы x, A>скорее желательное чем обязательное, пусть будет и 31% и 32% или 90% на худой конец,
Так я Вам и не предлагал 0.99999. Вопрос был на сколько принципиально, что x1+...+xn=X и c1x1+...+cnxn=A.
Ну например, если A это память, то понятно, что A-10 тоже подойдет. В таком случае ищете решение в нецелых, которое дает наилучшие веса, а потом округляете вниз. В чем задача-то?
Здравствуйте, vadimcher, Вы писали:
V>Здравствуйте, alexs72, Вы писали:
A>>Мне как раз важно чтобы х всегда были целыми, х=0.99999 никак не пойдет. A>>А вот ограничение на то что х1 должно быть 30% от всей суммы x, A>>скорее желательное чем обязательное, пусть будет и 31% и 32% или 90% на худой конец,
V>Так я Вам и не предлагал 0.99999. Вопрос был на сколько принципиально, что x1+...+xn=X и c1x1+...+cnxn=A. V>Ну например, если A это память, то понятно, что A-10 тоже подойдет. В таком случае ищете решение в нецелых, которое дает наилучшие веса, а потом округляете вниз. В чем задача-то?
Да может быть действительно задачи мне и надо было начать, а не с уравнений
Задача такая: по электричкам за определенный период есть такие показатели: сумма и количество билетов.
Еще есть тариф , т.е сумма за проезд от одной зоны до другой.
Надо посчитать сколько пассажиров проехало от одной зоны до другой (х),
учитывая что варианты поездок заранее заданы (допустим все пассажиры едут с 0зоны до 1 , с 0 до 2 и с 0 до 3)
Здравствуйте, alexs72, Вы писали:
A>Здравствуйте, vadimcher, Вы писали:
V>>Здравствуйте, alexs72, Вы писали:
A>>>Мне как раз важно чтобы х всегда были целыми, х=0.99999 никак не пойдет. A>>>А вот ограничение на то что х1 должно быть 30% от всей суммы x, A>>>скорее желательное чем обязательное, пусть будет и 31% и 32% или 90% на худой конец,
V>>Так я Вам и не предлагал 0.99999. Вопрос был на сколько принципиально, что x1+...+xn=X и c1x1+...+cnxn=A. V>>Ну например, если A это память, то понятно, что A-10 тоже подойдет. В таком случае ищете решение в нецелых, которое дает наилучшие веса, а потом округляете вниз. В чем задача-то?
Ну после того, как Вы получили решение в нецелых -- уже ни в чем. Только это решение еще получить надо было.
A>Да может быть действительно задачи мне и надо было начать, а не с уравнений A>Задача такая: по электричкам за определенный период есть такие показатели: сумма и количество билетов. A>Еще есть тариф , т.е сумма за проезд от одной зоны до другой. A>Надо посчитать сколько пассажиров проехало от одной зоны до другой (х), A>учитывая что варианты поездок заранее заданы (допустим все пассажиры едут с 0зоны до 1 , с 0 до 2 и с 0 до 3)
А веса-то тут причем? У Вас будет много вариантов. А кроме того, Вы уверены, что нет погрешности, например, в сумме, уплаченной за все билеты, в количестве билетов? Т.е. что сумма в точности соответствует тому количеству билетов, что Вам дано?
А вот зайца кому, зайца-выбегайца?!
Re[7]: решение уравнения
От:
Аноним
Дата:
13.03.08 22:45
Оценка:
Здравствуйте, alexs72, Вы писали:
A>Задача такая: по электричкам за определенный период есть такие показатели: сумма и количество билетов. A>Еще есть тариф , т.е сумма за проезд от одной зоны до другой. A>Надо посчитать сколько пассажиров проехало от одной зоны до другой (х), A>учитывая что варианты поездок заранее заданы (допустим все пассажиры едут с 0зоны до 1 , с 0 до 2 и с 0 до 3)
Не корректно поставленная задача. Даже если у тебя есть информация сколько продано билетов и сумма по каждой станции.
То Co -- стоимость одной зоны, P(a,b) -- это кол-во пассажиров купивших билет от a до b и твои суммы для k-ой станции
B(k)=sum(P(k,b),b=1..N)
S(k)=Co*sum(P(k,b)*|k-b|,b=1..N)
P(a,a)=0
Т.е. у тебя P(k,b) ==> N^2 неизвестных а уравнений всего 3*N
то есть решение возможно только если есть всего 3 станции
Либо надо накладывать ограничения на распределение P(a,b) в зависимости от самих станции и платежеспособности пассажиров или тупо смоделировать по выборке
и потом у тебя пасожиро-поток может быть замкнутым и не замкнутым. логично предположить что основная часть ездит на электричке туда-сюда
т.е. постоянно со станции а на станцию b и берёт билет туда сюда или проездной или бегает от контролёров. другая составляющая проезжие,
но их по идее должно быть значительно меньше. те что ездят постоянно тоже делятся на несколько групп: те что едут на работу, студенты, дачники и зайцы.
их можно выявить по времени поездки и по учебным заведениям привязанным к станциям и времени движения поездов так что ищите дополнительную информацию,
той что имеется явно не достаточно.
A>>Да может быть действительно задачи мне и надо было начать, а не с уравнений A>>Задача такая: по электричкам за определенный период есть такие показатели: сумма и количество билетов. A>>Еще есть тариф , т.е сумма за проезд от одной зоны до другой. A>>Надо посчитать сколько пассажиров проехало от одной зоны до другой (х), A>>учитывая что варианты поездок заранее заданы (допустим все пассажиры едут с 0зоны до 1 , с 0 до 2 и с 0 до 3)
V>А веса-то тут причем? У Вас будет много вариантов. А кроме того, Вы уверены, что нет погрешности, например, в сумме, уплаченной за все билеты, в количестве билетов? Т.е. что сумма в точности соответствует тому количеству билетов, что Вам дано?
Под весом я имел ввиду процентное отношение поездок по определенному направлению относительно
всех поездок. Т.е с 0 зона до 1 должно ехать ~30% и т.д.
По поводу погрешности в количестве и сумме — нет ее не будет все это точно.
А>Не корректно поставленная задача. Даже если у тебя есть информация сколько продано билетов и сумма по каждой станции. А>То Co -- стоимость одной зоны, P(a,b) -- это кол-во пассажиров купивших билет от a до b и твои суммы для k-ой станции А>B(k)=sum(P(k,b),b=1..N) А>S(k)=Co*sum(P(k,b)*|k-b|,b=1..N) А>P(a,a)=0 А>Т.е. у тебя P(k,b) ==> N^2 неизвестных а уравнений всего 3*N А>то есть решение возможно только если есть всего 3 станции
Немного не так, нет понятия стоимость одной зоны.
Т.е, например стоимость от 0 до 1 — 9р, 0 до 2 — 12 , 0 до 3 16,т.е. зависимость нелинейная.
поэтому и пишу что уравнение будет вида
a1*x1+a2*x2 ... = summa, где a1-тариф от 0 до 1 зоны, a2-тариф от 0 до 2 зоны.
количество зон не более 10.
количество возможных маршрутов от зоны до зоны будет задано давайте зададим тоже 10
А>Либо надо накладывать ограничения на распределение P(a,b) в зависимости от самих станции и платежеспособности пассажиров или тупо смоделировать по выборке
эти данные будут даны т.е. будут цифры на те маршруты что будут в уравнении ,
т.е. например количество по маршруту 1(от 0 до 1 зоны) должно стремиться к 30% от общей ,
по маршруту 2 к 20% и т.д.
А>ps: экономисти блин
Re[9]: решение уравнения
От:
Аноним
Дата:
14.03.08 10:35
Оценка:
Здравствуйте, alexs72, Вы писали:
А>>Не корректно поставленная задача. Даже если у тебя есть информация сколько продано билетов и сумма по каждой станции. А>>То Co -- стоимость одной зоны, P(a,b) -- это кол-во пассажиров купивших билет от a до b и твои суммы для k-ой станции А>>B(k)=sum(P(k,b),b=1..N) А>>S(k)=Co*sum(P(k,b)*|k-b|,b=1..N) А>>P(a,a)=0 А>>Т.е. у тебя P(k,b) ==> N^2 неизвестных а уравнений всего 3*N А>>то есть решение возможно только если есть всего 3 станции A>Немного не так, нет понятия стоимость одной зоны. A>Т.е, например стоимость от 0 до 1 — 9р, 0 до 2 — 12 , 0 до 3 16,т.е. зависимость нелинейная. A>поэтому и пишу что уравнение будет вида A>a1*x1+a2*x2 ... = summa, где a1-тариф от 0 до 1 зоны, a2-тариф от 0 до 2 зоны. A>количество зон не более 10. A>количество возможных маршрутов от зоны до зоны будет задано давайте зададим тоже 10
Какая разница. Это была всего лиш модель. если у тебя есть таблица цен по зонам M(a,b)-стоимоть проезда от a до b
B(k)=sum(P(k,b),b=1..N)
S(k)=sum(P(k,b)*M(k,b),b=1..N)
P(a,a)=0
То это ничего не меняет N^2 неизвестных и 3*N уравнений. т.е. только в случае 3х станций.
А>>Либо надо накладывать ограничения на распределение P(a,b) в зависимости от самих станции и платежеспособности пассажиров или тупо смоделировать по выборке A>эти данные будут даны т.е. будут цифры на те маршруты что будут в уравнении , A>т.е. например количество по маршруту 1(от 0 до 1 зоны) должно стремиться к 30% от общей , A>по маршруту 2 к 20% и т.д.
Если эти данные есть P(a,b) то уже всё есть и ничего не надо P(a,b)=Po*p(a,b)
Кол-во пассажиров пересекающих a -> a+1
Zr(a)=sum( P(i,j), i=1..a, j=a+1..N )
и в другую сторону
Zl(a)=sum( P(j,i), i=1..a, j=a+1..N )
но это только если все покупают билет в одну сторону, нет зайцев и нет проездных