Upload
cucu-eugen
View
218
Download
0
Embed Size (px)
Citation preview
8/16/2019 Laborator 1 Cucu Eugeniu
1/5
Ministerul Educației al Republicii Moldova
Universitatea Tehnică a Moldovei
Catedra Automatica si Tehnologii Informationale
RAPORTLucrarea de laborator nr.1
la Cercetari Opera ț ionale
Tema: Optimizarea necondiționată
Varianta 9
A efectuat:
st. gr. SI-141 E. Cucu
A verificat:
lector superior V.Bagrin
Chișinău 2016
8/16/2019 Laborator 1 Cucu Eugeniu
2/5
Scopul lucrării
Studiul metodelor de optimizare neliniară fără restricții. Definirea și utilizarea unor proceduri pentru minimizarea funcțiilor cu ajutorul
metodei gradientului și a metodelor de direcții conjugate cu o eroare mai mică
= 10−5 . Analiza rezultatelor obținute, inclusiv stabilirea tipului minimului local sau global. Să se compare rezultatele, luând în considerare numărul de iterații, evaluările pentru
funcție si gradient.
Mersul lucrării
Să se determine minimul global al funcției , = + 2 + 2 3 Varianta 9 : a = 2, b = 4.
Aproximația inițiala
, =1,1
Argumentarea solutiei:
4 + 2 2 = 0 = > = 0 . 32 + 8 3 = 0 = > = 0 . 2 4 22 8 det(1) = det(4) = 4 > 0 ; det(2) = 20 > 0 deci (0.3,0,2) este punct minim.
1. Determinam gradientul funcției ∇, = (4 + 2 22 + 8 3) = ∇1,1 = 47
2. Determinam (alfa) din formula(2(1-4 )^2+2*(1-4 )(1-7 )+4(1-7 )^2-2(1-4 )-3(1-7 ))' = 0
3. Cu ajutorul metodei iterative cu condiția de stopare ||∇, | | < 1 0−5,determinam , minimul global al funcției , cu dupa forula , = − , − ∇− , −.
Listingul programului
import javacalculus.core.CALC;
import javacalculus.core.CalcParser;import javacalculus.evaluator.CalcSUB;import javacalculus.struct.CalcDouble;import javacalculus.struct.CalcObject;import javacalculus.struct.CalcSymbol;//2*x^2+2*x*y+4*y^2-2*x-3*y
import java.util.Scanner;
public class MinimumCalculate{
public static void main(String[] args) throws Exception{
Scanner in = new Scanner(System.in);System.out.println("Enter expression:");
String expressionFunction = in.nextLine();CalcParser parser = new CalcParser();CalcObject resultX = parser.parse("DIFF(" + expressionFunction + ", "
8/16/2019 Laborator 1 Cucu Eugeniu
3/5
+ "x" + ")").evaluate();CalcObject resultY = parser.parse("DIFF(" + expressionFunction + ", "
+ "y" + ")").evaluate();CalcObject resultFunction =
parser.parse(expressionFunction).evaluate();System.out.println("Gradient Method");gradientMethod(expressionFunction, resultX, resultY, resultFunction);
System.out.println("Hestenes-Stiefel Method");hestenesStiefelMethod(4,2,8,1,1,resultX, resultY, resultFunction);
}
private static void hestenesStiefelMethod(double h11, double h12, doubleh22, double firstX, double firstY, CalcObject resultX, CalcObject resultY,CalcObject resultFunction) throws InterruptedException {
double x = 0,y = 0;double alpha;double[] d0 = new double[2];double[] d1 = new double[2];double gradient0X = getValue(firstX, firstY, resultX);double gradient0Y = getValue(firstX, firstY, resultY);if((int)gradient0X == 0 && (int)gradient0Y == 0)
System.out.println("x = " + firstX + "\ny = " + firstY + "\nf(x) = " +getValue(firstX,firstY,resultFunction));
else {d0[0] = gradient0X * (-1);d0[1] = gradient0Y * (-1);alpha = -
((gradient0X*d0[0]+gradient0Y*d0[1])/((2*d0[0]+1*d0[1])*d0[0])+((1*d0[0]+1*d0[1])*d0[1]));
x = firstX + (alpha*d0[0]);y = firstY + (alpha*d0[1]);if((int)getValue(x,y,resultX) == 0 && (int)getValue(x,y,resultY)
== 0) {System.out.println("x = " + x + "\ny = " + y + "\nf(x) = " +
getValue(x,y,resultFunction));}
else {double x1,y1;x1 = getValue(x,y,resultX);y1 = getValue(x,y,resultY);while((int)x1 != 0 && (int)y1 != 0) {
x1 = getValue(x, y, resultX);y1 = getValue(x, y, resultY);d1[0] = -x1 + ((((x1 * x1) + (y1 * y1)) / ((gradient0X *
gradient0X) + gradient0Y * gradient0Y)) * d0[0]);d1[1] = -y1 + ((((x1 * x1) + (y1 * y1)) / ((gradient0X *
gradient0X) + gradient0Y * gradient0Y)) * d0[1]);alpha = -((x1 * d1[0] + y1 * d1[1]) / (((h11 * d1[0] +
h12 * d1[1]) * d1[0]) + ((h12 * d1[0] + h22 * d1[1]) * d1[1])));gradient0X = x1;gradient0Y = y1;
x = x + (alpha * d1[0]);y = y + (alpha * d1[1]);
}System.out.println("x = " + x + "\ny = " + y + "\nf(x) = " +
getValue(x,y,resultFunction));}
}}
private static double getValue(double prevX, double prevY, CalcObjectresult) {
result = substituteVariable(result, "x", prevX);result = substituteVariable(result, "y", prevY);result = CALC.SYM_EVAL(result);
return Double.parseDouble(result.toString());}
8/16/2019 Laborator 1 Cucu Eugeniu
4/5
private static String getAlpha(double prevX, double prevY, Stringexpression, CalcObject resultX, CalcObject resultY) {
resultX = substituteVariable(resultX, "x", prevX);resultX = substituteVariable(resultX, "y", prevY);resultY = substituteVariable(resultY, "x", prevX);resultY = substituteVariable(resultY, "y", prevY);resultX = CALC.SYM_EVAL(resultX);
resultY = CALC.SYM_EVAL(resultY);expression = expression.replace("x","(1-" +
(int)Double.parseDouble(resultX.toString()) + "*alpha)");expression = expression.replace("y","(1-" +
(int)Double.parseDouble(resultY.toString()) + "*alpha)");return expression;
}
static CalcObject substituteVariable(CalcObject input, String var, doublenumber) {
CalcSymbol symbol = new CalcSymbol(var);CalcDouble value = new CalcDouble(number);return CalcSUB.numericSubstitute(input, symbol, value);
}
private static void gradientMethod(String expression, CalcObject resultX,CalcObject resultY, CalcObject resultFunction) {
double prevX = 1,prevY = 1;double x = 0,y = 0;double alpha = 0.5;double gradientX;double gradientY;double error = 1000000;int iterator = 0;while(error > 0.001) {
iterator++;gradientX = getValue(prevX, prevY, resultX);gradientY = getValue(prevX, prevY, resultY);x = prevX - (alpha * gradientX);
y = prevY - (alpha * gradientY);if(getValue(x,y,resultFunction) -
getValue(prevX,prevY,resultFunction) > 0) {alpha /= 2;iterator--;
}else {
error = Math.sqrt(Math.pow(gradientX, 2) +Math.pow(gradientY, 2));
prevX = x;prevY = y;
}}System.out.println("x = " + x);if (expression.contains("y")) {
System.out.println("y = " + y);System.out.println("f(x,y) = " + getValue(x, y, resultFunction));
}else System.out.println("f(x) = " + getValue(x,y,resultFunction));System.out.println("iterator = " + iterator);
}}
8/16/2019 Laborator 1 Cucu Eugeniu
5/5
Afisarea rezulatelor obținute
Concluzie
În urma efectuării lucrării de laborator, am obținut cunoștințe in determinareaminimului global al unei funcții.
În programul elaborat utilizatorul introduce expresia funcției si automat segenereaza funcția pentru determinarea lui alfa, la rezolvarea acestei ecuatii(derivareaapoi determinarea lui alfa din egalarea ecuatiei cu 0) automat de program am întilnitgreutăți deoarece nu am putut realiza determinarea necunoscutei, de pe alta parte
programul calculeaza automat gradientul lui x si y astfel generindu-se o functie pentru
determinarea lui alfa, usor determînd manual sau folosindu-ne de platformawolframalpha.com unde copiem functia obtinuta si obtinem rezultatul.
Dupa determinarea lui alfa îl introducem in program si automat se calculeazăminimul global al funcției și afișînd la ecran valoarea minima a lui x,y funcția in
punctul dat si numarul de iterații realizate.