Решение большой системы нелинейных уравнений - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь решить систему из 30 нелинейных уравнений (неизвестные переменные находятся внутри экспоненциальных функций).У меня ровно 30 переменных и 30 неизвестных.Я пытаюсь использовать scipy.optimize.fsolve, но по сути ничего не делает.Я опубликую свою попытку ниже.

Ниже yu, yd и Vckm - известные матрицы с элементами в диапазоне от 1e-6 до 1, а функция qyuk (ca, cb, lam) зависит от Exp [(1 - ca - cb) lam].Моя система сложна, потому что эта экспонента должна воспроизводить небольшие числа (~ 1e-6), поэтому мое решение чрезвычайно чувствительно.

def f(c):
    cq1,cq2,cq3,cu1,cu2,cu3,cd1,cd2,cd3,ce1,ce2,ce3,lu1,lu2,lu3,lu4,lu5,lu6,lu7,lu8,lu9,du1,du2,du3,du4,du5,du6,du7,du8,du9 = c


    Gu = [[qyuk(cq1,cu1,lam),qyuk(cq1,cu2,lam),qyuk(cq1,cu3,lam)],
          [qyuk(cq2,cu1,lam),qyuk(cq2,cu2,lam),qyuk(cq2,cu3,lam)],
          [qyuk(cq3,cu1,lam),qyuk(cq3,cu2,lam),qyuk(cq3,cu3,lam)]]

    Gd = [[qyuk(cq1,cd1,lam),qyuk(cq1,cd2,lam),qyuk(cq1,cd3,lam)],
          [qyuk(cq2,cd1,lam),qyuk(cq2,cd2,lam),qyuk(cq2,cd3,lam)],
          [qyuk(cq3,cd1,lam),qyuk(cq3,cd2,lam),qyuk(cq3,cd3,lam)]]

    Gu_squared = np.matmul(Gu,np.transpose(Gu))
    Gd_squared = np.matmul(Gd,np.transpose(Gd))

    Ul = [[lu1,lu2,lu3],[lu4,lu5,lu6],[lu7,lu8,lu9]]
    Dl = [[du1,du2,du3],[du4,du5,du6],[du7,du8,du9]]

    rul = np.matmul(np.transpose(Ul),np.matmul(yu,np.matmul(yu,Ul)))
    rdl = np.matmul(np.transpose(Dl),np.matmul(yd,np.matmul(yd,Dl)))

    rvckm = np.matmul(np.transpose(Ul),Dl)


    return (
        Gu_squared[0][0] - rul[0][0],Gu_squared[0][1] - rul[0][1],Gu_squared[0][2] - rul[0][2],
        Gu_squared[1][0] - rul[1][0],Gu_squared[1][1] - rul[1][1],Gu_squared[1][2] - rul[1][2],
        Gu_squared[2][0] - rul[2][0],Gu_squared[2][1] - rul[2][1],Gu_squared[2][2] - rul[2][2],
        Gd_squared[0][0] - rdl[0][0],Gd_squared[0][1] - rdl[0][1],Gd_squared[0][2] - rdl[0][2],
        Gd_squared[1][0] - rdl[1][0],Gd_squared[1][1] - rdl[1][1],Gd_squared[1][2] - rdl[1][2],
        Gd_squared[2][0] - rdl[2][0],Gd_squared[2][1] - rdl[2][1],Gd_squared[2][2] - rdl[2][2],
        qyuk(ce1,ce1,lam) - ye[0][0],qyuk(ce2,ce2,lam) - ye[1][1],qyuk(ce3,ce3,lam) - ye[2][2],
        Vckm[0][0] - rvckm[0][0],Vckm[0][1] - rvckm[0][1],Vckm[0][2] - rvckm[0][2],
        Vckm[1][0] - rvckm[1][0],Vckm[1][1] - rvckm[1][1],Vckm[1][2] - rvckm[1][2],
        Vckm[2][0] - rvckm[2][0],Vckm[2][1] - rvckm[2][1],Vckm[2][2] - rvckm[2][2],
        )

c = scipy.optimize.fsolve(f,np.full((30,1),.6))

Моя проблема в том, что fsolve возвращает мусор, и мое решение не решает мою систему уравнений, даже близко не.Любая помощь будет оценена.Спасибо.

1 Ответ

0 голосов
/ 15 октября 2018

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

...