Система уравнений Сципи с несколькими уравнениями - PullRequest
0 голосов
/ 19 ноября 2018

Здравствуйте, у меня проблема с использованием функции Сципи fsolve, когда у меня есть система уравнений.

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

Какмой вопрос: вставить больше уравнений, чем переменных?

Предположим, у меня есть следующая нелинейная система:

A/B=0.4583(3)
A/C=0.25
A/D=0.72(2)
B/C=0.54(54)

Итак, у меня есть следующий код для этого:

from scipy.optimize import *
from numpy  import *

def FUNC(arg):

    A,B,C,D=arg
    UNK=empty((4))  

    UNK[0]= A/B-0.458333333333333
    UNK[1]= A/C-0.25
    UNK[2]= A/D-0.722222222222222
    UNK[3]= B/C-0.545454545454546

    return UNK


SOLVED= fsolve(FUNC, [1.0]*4)

print (SOLVED)

Проблема в том, что я также знаю следующую информацию:

B/D=1.57(57)
C/D=2.8(8)

Как я могу вставить эти 2 дополнительных уравнения в мою систему уравнений?

Кроме того, как я могу отобразить диапазон решений вместо одного решения, похоже, что fsolve отображает только 1-е решение, которое встречается, а не весь диапазон возможных решений.

1 Ответ

0 голосов
/ 19 ноября 2018

Обратите внимание, что fsolve от scipy - это просто оболочка для процедуры hybrd в MINPACK:

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

Если вы хотите решить систему из 6 уравнений, ваша функция FUNC должна быть функцией от 6 переменных. Мы могли бы сделать это так:

import numpy as np
from scipy.optimize import fsolve

def FUNC(arg):
    A, B, C, D, E, F = arg
    UNK=np.empty((6))  

    UNK[0]= A/B-0.458333333333333
    UNK[1]= A/C-0.25
    UNK[2]= A/D-0.722222222222222
    UNK[3]= B/C-0.545454545454546
    UNK[4]= B/D-1.575757575757575
    UNK[5]= C/D-2.888888888888888
    return UNK

fsolve(FUNC, x0=[1.0]*6)

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

...