Как решать большие нелинейные уравнения?

У меня есть 3 больших нелинейных уравнения с тремя неизвестными, когда я scipy.optimize.fsolve получаю ответ около 10^85, что слишком велико. Также выдается предупреждение Runtime.

import scipy.optimize as opt
def func(variables):
    (A, B, C) = variables
    x1=4
    x2=10
    x3=20
    x4=5
    y1=4
    y2=15
    y3=10
    y4=10

    eq1 = ((((x2)/(A*x2+B*y2+C))-((x1)/(A*x1+B*y1+C))) *  (((x3)/(A*x3+B*y3+C))-((x2)/(A*x2+B*y2+C))) + (((y2)/(A*x2+B*y2+C))-((y1)/(A*x1+B*y1+C))) * (((y3)/(A*x3+B*y3+C))-((y2)/(A*x2+B*y2+C))) +(((1 )/(A*x2+B*y2+C))-((1 )/(A*x1+B*y1+C))) * (((1 )/(A*x3+B*y3+C))-((1 )/(A*x2+B*y2+C))))
    eq2 = ((((x3)/(A*x3+B*y3+C))-((x2)/(A*x2+B*y2+C))) * (((x4)/(A*x4+B*y4+C))-((x3)/(A*x3+B*y3+C))) + (((y3)/(A*x3+B*y3+C))-((y2)/(A*x2+B*y2+C))) * (((y4)/(A*x4+B*y4+C))-((y3)/(A*x3+B*y3+C))) +(((1 )/(A*x3+B*y3+C))-((1 )/(A*x2+B*y2+C))) * (((1 )/(A*x4+B*y4+C))-((1 )/(A*x3+B*y3+C))))
    eq3 = ((((x4)/(A*x4+B*y4+C))-((x3)/(A*x3+B*y3+C))) * (((x1)/(A*x1+B*y1+C))-((x4)/(A*x4+B*y4+C))) + (((y4)/(A*x4+B*y4+C))-((y3)/(A*x3+B*y3+C))) * (((y1)/(A*x1+B*y1+C))-((y4)/(A*x4+B*y4+C))) +(((1 )/(A*x4+B*y4+C))-((1 )/(A*x3+B*y3+C))) * (((1 )/(A*x1+B*y1+C))-((1 )/(A*x4+B*y4+C))))

    return [eq1, eq2, eq3]


solution = opt.fsolve(func, np.array([1,1,1]))
print(solution)

и ответ:

RuntimeWarning:The number of calls to function has reached maxfev = 800.
      warnings.warn(msg, RuntimeWarning)
    [6.72215161e+84 5.84595081e+84 6.34963908e+85]

В чем моя ошибка?


person mahdi bagheri    schedule 01.04.2020    source источник
comment
Похоже, версия Python расходится. Можете ли вы попробовать использовать меньшее значение для factor (например, 10 или 1)?   -  person BlackBear    schedule 01.04.2020
comment
Кроме того, какой алгоритм использует Matlab? Возможно, это реализовано и в scipy (docs.scipy.org/doc/scipy-0.14.0/reference/generated/)   -  person BlackBear    schedule 01.04.2020
comment
@Черный медведь . Пробовал 0.001,0.01,0.1 ответ все тот же.   -  person mahdi bagheri    schedule 01.04.2020
comment
@BlackBear Я проверил ссылку и использовал разные алгоритмы, установив tol таким образом, чтобы предотвратить расхождение, и наконец обнаружил, что три алгоритма имеют одинаковый результат. Спасибо за ваш хороший ответ.   -  person mahdi bagheri    schedule 01.04.2020
comment
Вероятно, это не то, что вам нужно, но z3 может быть тем, что вам здесь нужно?   -  person Gareth Ma    schedule 01.04.2020
comment
Похоже, вы много раз удваивали скобки, например. ((1 )/(A*x1+B*y1+C)) можно без проблем записать как 1/(A*x1+B*y1+C). Поэтому я бы дважды проверил, что уравнения и скобки, в частности, соответствуют вашим ожиданиям.   -  person Paddy Harrison    schedule 01.04.2020
comment
@ Гарет Ма Нет, [A, B, C] неизвестны. на самом деле они являются параметрами плоскости в трехмерной декартовой координации. где вы нашли z3? :)   -  person mahdi bagheri    schedule 01.04.2020
comment
z3 - это SAT-решатель, лол. погуглите найдете   -  person Gareth Ma    schedule 01.04.2020
comment
@ Пэдди Харрисон, на самом деле, я сделал это, чтобы выровнять уравнения. Вы видите, что линии хорошо дисциплинированы, если что-то пропущено, это появится, сдвинув все. хотя вы правы, можно было бы написать так, как вы сказали.   -  person mahdi bagheri    schedule 01.04.2020


Ответы (1)


Также в scipy-optimize включен fmin_tnc, который позволяет размещать границы на корнях:

opt.fmin_tnc(func,x0=np.array([1,1,1]),
             approx_grad=True, 
             bounds=[(None,1E5),(None,1E5),(None,1E5)])
person EMiller    schedule 01.04.2020