2015-07-15 4 views
3

Я пытаюсь понять, как настроить проблему минимизации python scipy. Это пример, который я использовал в решении Excel Solver. Самый простой способ объяснить проблему является пытается решить очень простую электрическую сеть:Как настроить минимизацию с scipy lesssq

R1: 100 
R2: 1000 
R3: 50 
U: 10 

три резистора, два параллельных (R2, R3), а затем последовательно с R1. Питание 10 вольт

Руководящими уравнения

i1 - i2 - i3 = 0 
U - i1*R1 - i2*R2 = 0 
U - i1*R1 - i3*R3 = 0 

Раствор для i1, i2, i3 определяется путем минимизации целевой функции дано как

(i1-i2-i3)**2 + (U-i1R1-i2R2)**2 + (U-i1*R1-i3R3)**2 

Как реализовать эту проблему scipy lesssq?

Причина, по которой я хочу использовать lesssq, состоит в том, что моя реальная сеть намного сложнее и содержит нелинейные элементы (на самом деле это не электрическая сеть, а гидравлика).

Большое спасибо! Willem

ответ

0

Прежде всего определить фактическую целевую функцию, которая должна принимать ваши неизвестные переменные в качестве аргумента

def objective(x): 
    i1, i2, i3 = x 
    R1 = 100 
    R2 = 1000 
    R3 = 50 
    U = 10 
    return (i1-i2-i3)**2 + (U-i1*R1-i2*R2)**2 + (U-i1*R1-i3*R3)**2 

Тогда вы предоставить некоторые первоначальные предположения для токов

x0 = [1.0, 1.0, 1.0] # or whatever you want to start with 

Затем вызовите minimize

from scipy.optimize import minimize 
res = minimize(objective, x0) 

Вы также можете передать аргумент method, если вы хотите указать a specific minimization algorithm.

Кроме того, если вы можете определить свои якобианские (и, возможно, ваши гессианские) матрицы, вы также можете использовать метод на основе градиента, передав соответственно аргументы jac и hess, которые должны сходиться быстрее.