2016-07-28 2 views
2

Ich habe folgendes Testprogramm. Meine Abfrage ist zwei gefaltet: (1) Einige, wie die Lösung Null gibt und (2) Ist es angemessen, diese Art von Bedingungen auf Variablen zu verwenden? Gibt es in Scipy eingeschränkte Optimierungsroutinen?Lösen simultaner Gleichungen in Python

a = 13.235 
b = 70.678 

def system(X, a,b): 
    x=X[0] 
    y=X[1] 

    x2= np.where(x > y, 1, x)  

    f=np.zeros(3) 
    f[0] = 2*x2 - y - a 
    f[1] = 3*x2 + 2*y- b 


    return (X) 


func= lambda X: system(X, a, b) 

guess=[5,5] 
sol = optimize.root(func,guess) 
print(sol) 

edit: (2a) hier mit x2= np.where(x > y, 1, x) Zustand wird zwei Gleichungen eine Gleichung. (2b) In einer anderen Variation Anforderung ist: x2= np.where(x > y, x^2, x^3). Lassen Sie mich auch zu diesen beiden kommentieren. Vielen Dank !

+0

@erip, LP Algorithmen kann nicht nicht-lineare Gleichungen behandeln. Ist es nicht wahr? Meine typischen Gleichungen sind nur repräsentativ. Sie sind in der Tat Log und Exp-Formen. – learner123

Antwort

1

Zunächst ist Ihre system Funktion eine Identität, da Sie statt return f. Die Rückkehr sollte die gleiche Form wie die X sein, so sollten Sie besser

f = np.array([2*x2 - y - a, 3*x2 + 2*y- b]) 

Als nächstes wird die Funktion haben, wie geschrieben hat eine Diskontinuität in der x = y, und dies verursacht ein Problem für die anfängliche Vermutung sein von (5,5). Wenn die anfängliche Schätzung auf (5,6) gesetzt wird, kann die Lösung [13.87828571, 14.52157143] schnell gefunden werden.

Mit dem zweiten Beispiel verursacht wiederum eine anfängliche Schätzung von [5,5] Probleme der Diskontinuität, die Verwendung von [5,6] ergibt eine Lösung von [2,40313743, 14,52157143].

Hier ist mein Code:

import numpy as np 
from scipy import optimize 

def system(X, a=13.235, b=70.678): 
    x = np.where(X[0] > X[1], X[0]**2, X[0]**3) 
    y=X[1]  
    return np.array([2*x - y - a, 3*x + 2*y - b]) 

guess = [5,6] 
sol = optimize.root(system, guess) 
print(sol)