Помогите реализовать уравнение на PHP

AS
На сайте с 12.02.2009
Offline
0
616

W=T1*x1+T2*x2+T3*x3/N, где T1,T2,T3,N - задаются, все значения х -натуральные числа, значение W от 2 до 2.2, нужно вывести все устраивающие значения x.

[Удален]
#1

ну вопрос больше не в пхп а в методах реализации. Если коэффициенты - произвольные действительные числа то вам стоит погуглить на тему выбора подходящего метода решения - метод хорд, метод Гаусса-Зейделя, градиентный метод и еще куча. Если коэффициенты строго неотрицательны (соответственно и W должен быть неотрицательным иначе решения нет), то возможно, наиболее эффективным будет метод направленного перебора


/*ввод коээфициентов и W*/

$funcValue=0;

for ($x1=0;$x1++;$funcValue<$W)
{
for ($x2=0;$x2++;$funcValue<$W)
{
for ($x3=0;$x3++;$funcValue<$W)
$funcValue=$T1*$x1+$T2*$x2+$T3*$x3/$N;
$x3--;
}
$x2--;
}

if ($funcValue>$W)
die("Решений нет"); //это не значит что их нет, это значит что надо поменять местами переменные в цикле

printf("Решение: x1=%i; x2=%i; x3=%i",$x1,$x2,$x3);

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

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

В случае, если среди коэффициентов есть иррациональные, некомпенсирующие друг друга , решений нет гарантировано. Но правда в пхп вы иррациональные числа не забьете =)

Если под натуральными понимаются истинно натуральные (не включая ноль), то стартовые условия циклов нужно поменять на соответсвующие присваиваения $xi=1;

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий