private List <string> getResults(IDerivativeFunction function, double eps, double x1, double x2, double alpha, double betta, double lambda) { List <string> results = new List <string>(); double x1_prev, x2_prev; double dx1, dx2; double prevFunc, resFunc; int k = 1; do { dx1 = function.getDerivativeX1().getY(x1, x2); //первая производная по х1 dx2 = function.getDerivativeX2().getY(x1, x2); //первая производная по x2 x1_prev = x1; x2_prev = x2; x1 -= alpha * dx1; //новое х1 x2 -= alpha * dx2; //новое х2 prevFunc = function.getY(x1_prev, x2_prev); resFunc = function.getY(x1, x2); results.Add(String.Format("k={0} x1={1} x2={2} f(x1,x2)={3}", k++, Math.Round(x1, 3), Math.Round(x2, 3), Math.Round(resFunc, 3))); if (resFunc > prevFunc - 0.5 * lambda * Math.Sqrt(Math.Pow(dx1, 2) + Math.Pow(dx2, 2))) { alpha = lambda * betta; } } while ((Math.Abs(resFunc - prevFunc) > eps)); return(results); }
public List <string> getResults(IDerivativeFunction function, double x1, double x2, double e, double lam) { List <string> results = new List <string>(); int i = 0; // TO-DO remove code duplication Matrix grad = calculateGrad(function, x1, x2); x1 -= x1 - e * grad.get(0, 0); x2 -= x2 - e * grad.get(0, 1); results.Add(String.Format("k={0} x1={1} x2={2} f(x1,x2)={3}", i++, Math.Round(x1, 3), Math.Round(x2, 3), Math.Round(function.getY(x1, x2), 3))); Matrix prevGrad; do { prevGrad = grad; grad = calculateGrad(function, x1, x2); x1 -= lam * grad.get(0, 0); x2 -= lam * grad.get(0, 1); results.Add(String.Format("k={0} x1={1} x2={2} f(x1,x2)={3}", i++, Math.Round(x1, 3), Math.Round(x2, 3), Math.Round(function.getY(x1, x2), 3))); } while (Math.Abs((prevGrad - grad).get(0, 0)) > e && Math.Abs((prevGrad - grad).get(0, 1)) > e); return(results); }
private Matrix calculateGrad(IDerivativeFunction function, double x1, double x2) { return(new Matrix(new double[1, 2] { { function.getDerivativeX1().getY(x1, x2), function.getDerivativeX2().getY(x1, x2) } })); }