Ich habe ein lineares Problem, jedoch gibt es eine Bedingung, die nichtlinear ist. Sie lautet: x1 * x2 = 0. analog gibt es noch weitere Nebenbedingungen, nämlich x3 * x4 = 0 etc. Ist es überhaupt möglich, diese Nebenbedingungen zu formulieren, und wenn ja, weiß vielleicht jemand, wie man das in Lindo (proprietäre Lösungssoftware) macht?
Ohne diese Software zu kennen:
Du hast diese Nebenbedingung doch in deiner Frage formuliert.
Das Problem ist damit nicht mehr linear, folglich funktioniert ein entsprechendes Verfahren nicht mehr.
Wenn ich auf der richtigen Webseite war, kann dein Lindo aber auch nicht lineare Gleichungen lösen.
Alternativ kannst du ja vorab x1=0 einsetzen, dann bleibt nur noch x2 übrig. Ebenso kannst du x3=0 setzen, und wenn das alles war, hast du nun ein ggf. überbestimmtes, lineares Gleichungssystem.
Danach setzt du x1=0 und x4=0, bzw x2=0 und x3=0, bzw x2=0 und x4=0, und löst das ganze.
Ja, so bekommst du vier lösungsmengen, deren Vereinigung die Gesamtlösung ist.
Du siehst aber, der Rechenaufwand vergrößert sich schnell, wenn noch mehr dieser Bedingungen auftauchen.
Hallo sweber, danke für deine Antwort. Eben um die Formulierung des nichtlinearen Problems geht es mir. Das 0 setzen ist sicher ein guter Gedanke, allerdings habe ich 19 Variablen, daher geht das nicht. Ich bin mir nicht sicher, aber wie ich das sehe, kann man nur nichtlineare Nebenbedingungen der Form a*x^n angeben, aber kein Produkt von Variablen. Ich habe gehofft, dass jemand schon einmal mit so etwas zu tun gehabt hat. Das dürfte bei anderer Software ähnlich sein.
Mit formulieren meine ich die Formulierung in der Syntax der Software.
Das ist in den meisten Softwares/Programmiersprachen einfach, nennt sich Kostenfunktion und wird mittels Funktionshandle an den Optimierer gegeben. Oft ist die Kostenfunktion beliebig reellwertig, d.h. eine Abbildung von R^n -> R (>=0), Du mußt also die einzelnen Bedingungsstreifen noch irgendwie aggregieren, z.B. als Summe (und in C Syntax):
double costs(double x1, double x2, double x3, double x4)
{
return x1 * x2 + x3 * x4;
}
Ich benutze für nichtlineare Sachen mit komplexen Kosten gerne C-Routinen, da ein erheblicher Teil der Optimierung in der Kostenfunktion verbracht wird.
Die meisten Optimierer erlauben/verlangen auch noch, die Ableitung zurückzugegeben, die diese noch viel eher gebraucht wird als der eigentliche Kostenwert.
Hallo hroptatyr,
vielen Dank für die interessante Antwort. Allerdings habe ich bereits eine Kostenfunktion, die nicht geändert werden darf. Wie ich geschrieben habe, befindet sich die Nichtlinearität in den Nebenbedingungen (Constraints). Hätten Sie dafür vielleicht auch eine Lösung? Ich habe an die Firma Lindo geschrieben, sie haben geantwortet:
Our solvers support arbitrary nonlinear functions in constraints and the objective (e.g., x1*x2, x1^2, x1/x2). The functions can be non-convex, non-smooth/discontinuous, etc. The Global solver returns the mathematically proven globally optimal solution.
Ja, bei den Matlab-Optimierern geht es genauso, ein Handle für die Kosten, ein Handle für die Constraints (Ceq, Cleq, also =0 oder <=0).
Die Handles sehen dann im Prinzip genauso aus wie oben meine Kostenfunktion. Aber der Hinweis mit der Reellwertigkeit bleibt. Es müssen also alle Nebenbedingungen zu einem Wert zusammengefaßt werden.
Eine Tabkalk wie Excel oder Calc verfügt über einen Solver, der Optimierungsaufgaben lösen kann.
Baue eine Tabelle die eine beliebige Lösung errechnet und setze den Solver ein.
pda