Метод половинного деления java

Метод половинного деления

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
public class laba4optimiz { public static void main(String[] args) { double a = 1.0, b = 3.0, x = 0.0, c1,c2, eps = 0.000001, result = 0; double r = eps * (b-a); while (Math.abs(b - a) > eps) { c1 = (a + b - r) / 2; c2 = (a + b + r) / 2; if(func1(c1)  func2(c2)) { b = c2; } else if (func1(c1) > func2(c2)){ a = c1; } else { a = c1; b = c2; } } System.out.println("Значение корня = " + (a+b)/2); } public static double func1(double x1) { return (-(Math.exp(-x1) * Math.log(x1))); } public static double func2(double x2) { return (-(Math.exp(-x2) * Math.log(x2))); } }

Численные методы. Метод половинного деления
Нужно различными числовыми методами найти корень функции tan(0.3x+0.4)=x^2 Вопрос скорее всего.

Метод половинного деления,хорд,ньютона,комбинированный метод
Добрый день. Помогите пожалуйста написать код на Java к функции: X^3 — 50cos(x) с интервалом -4 и.

Метод половинного деления
Всем доброго дня ! Сразу извиняюсь за такую просьбу. Перепишите код на жабу , пожалуйста uses.

Метод бисекции (половинного деления)
Создать иерархию из трех наследующих друг от друга классов:1) класс статической завершенной.

Эксперт функциональных языков программированияЭксперт Python

Danil178, накрутил ты.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
public class laba4optimiz { public static void main(String[] args) { double a = 1.0, b = 3.0, x = 0.0, c1,c2, eps = 0.000001, result = 0; double r = eps * (b-a); while (Math.abs(b - a) > eps) { c1 = (a + b - r) / 2; c2 = (a + b + r) / 2; if(func(c1)  func(c2)) { b = c2; } else if (func(c1) > func(c2)){ a = c1; } else { a = c1; b = c2; } } System.out.println("Значение корня = " + (a+b)/2); } public static double func(double x) { return (-(Math.exp(-x) * Math.log(x))); } }

Эксперт функциональных языков программированияЭксперт Python

ЦитатаСообщение от Danil178 Посмотреть сообщение

Catstail, у экспоненты x должен быть отрицательным.

Эксперт функциональных языков программированияЭксперт Python

Danil178, да, мой график неправильный. Правильный ниже. И твой график тоже правильный. Но ты же ищешь корень на интервале, где функция не меняет знак!

Эксперт функциональных языков программированияЭксперт Python

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
public class laba4optimiz { public static void main(String[] args) { double a = 0.5, b = 3.0, x = 0.0, c1,c2, eps = 0.000001, result = 0; double r = eps * (b-a); while (Math.abs(b - a) > eps) { c1 = (a + b - r) / 2; c2 = (a + b + r) / 2; if(func(c1)  func(c2)) { b = c2; } else if (func(c1) > func(c2)){ a = c1; } else { a = c1; b = c2; } } System.out.println("Значение корня = " + (a+b)/2); } public static double func(double x) { return (-(Math.exp(-x) * Math.log(x))); } }

Эксперт функциональных языков программированияЭксперт Python

Danil178, посмотрел та твой код. Он ужасен. Выкинь его. Вот нормальное деление отрезка пополам:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
public class Main { public static void main(String[] args) { double a = 0.5, b = 3.0, c, eps = 0.000001; double fa=func(a), fb=func(b),fc; if (fa*fb>0) { System.out.println("На заданном отрезке функция не меняет знак"); return; } while (Math.abs(b - a) > eps) { c=0.5*(a+b); fc=func(c); if (Math.abs(fc)  eps) break; if (fc*fa  0) { b=c; fb=fc; } else { a=c; fa=fc; } } System.out.println("Значение корня = " + (a+b)*0.5); } public static double func(double x) { return (-(Math.exp(-x) * Math.log(x))); } }

Catstail, а вот если я беру начало отрезка a = 1 вместо 0.5, то почему значение корня равно 2.99995? корень должен находиться в интервале, где функция не меняет свой знак, я правильно понимаю?

Эксперт функциональных языков программированияЭксперт Python

ЦитатаСообщение от Danil178 Посмотреть сообщение

— потому, что и в моем коде есть алгоритмическая ошибка. Вот правильный код, ломай:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
public class Main { public static void main(String[] args) { double a = 1.0, b = 3.0, c, eps = 0.000001; double fa=func(a), fb=func(b),fc; if (Math.abs(fa)  eps) { System.out.println("Значение корня = "+a); return; } if (Math.abs(fb)  eps) { System.out.println("Значение корня = "+b); return; } if (fa*fb>0) { System.out.println("На заданном отрезке функция не меняет знак"); return; } while (Math.abs(b - a) > eps) { c=0.5*(a+b); fc=func(c); if (Math.abs(fc)  eps) break; if (fc*fa  0) { b=c; fb=fc; } else { a=c; fa=fc; } } System.out.println("Значение корня = " + (a+b)*0.5); } public static double func(double x) { return (-(Math.exp(-x) * Math.log(x))); } }

ЦитатаСообщение от Danil178 Посмотреть сообщение

Источник

Zheka’s blog

Развлечения ради, временами появляется желание покрутить задачки, которые выходят за рамки повседневного программирования. В разделе SICP 1.3.3 есть интересная, но несложная задачка. Более того, решение там приведено, но прежде чем смотреть его я попытался решить задачу самостоятельно и потом сравнить результаты.

Касательно реализации. Она достаточно упрощенная(напр. я не осуществляю проверку того, что a меньше b):

(ns sicp.clojure (:use [clojure.test :only [is]]) (:use [clojure.contrib.generic.math-functions :only [sin]]) (:use [clojure.contrib.math :only [abs]])) (defn get-middle [left right] (/ (+ left right) 2)) (defn get-adge-point [f middle x] (let [y1 (f middle) y2 (f x)] (cond (and (> y1 0) (> y2 0))middle (and ( y1 0) ( y2 0))middle :else x))) (defn good-enough? [left right] (  (- right left) 0.0001)) (defn half-interval-method-iter [f left middle right] (if (good-enough? left right) (get-middle left right) (let [left (get-adge-point f middle left) middle (get-middle left right) right (get-adge-point f middle right)] (recur f left middle right)))) (defn half-interval-method [f a b] (double (half-interval-method-iter f a (get-middle a b) b))) ;; sin(x)=0 (is (= 3.141571044921875 (half-interval-method sin 2 4))) ;; x^3 − 2x − 3 = 0 (is (= 1.893280029296875 (half-interval-method (fn [x] (- (* x x x) (* 2 x) 3)) 1 2)))

Для получения очередного(половинного) интервала следуем правилу:

f(x) не меняет свой знак по отношению к f(a), новый интервал -> [x:b] f(x) не меняет свой знак по отношению к f(b), новый интервал -> [a:x] 

Функция get-adge-point реализует этот алгоритм. x — среднее значение для a и b , которое вычисляется при помощи get-middle . good-enough? — вспомогательная функция для проверки достигли мы заданной точности при вычислении результата. Для сравнения реализация на java:

public class HalfMidleMethod  public static interface Fn  double f(double x); > private boolean isGoodEnough(double left, double right)  return (right - left)  0.0001; > private double getAdgePoint(Fn y, double middle, double x)  double y1 = y.f(middle); double y2 = y.f(x); if (y1 > 0 && y2 > 0)  return middle; > else if (y1  0 && y2  0)  return middle; > else  return x; > > private double getMiddle(double left, double right)  return (left + right) / 2; > private double getRoot(Fn y, double left, double middle, double right)  //System.out.println("left=" + left + ", middle=" + middle + ", right=" + right); if (isGoodEnough(left, right))  return getMiddle(left, right); > left = getAdgePoint(y, middle, left); right = getAdgePoint(y, middle, right); middle = getMiddle(left, right); return getRoot(y, left, middle, right); > public double getRoot(Fn y, double left, double right)  return getRoot(y, left, getMiddle(left, right), right); > public static void main(String[] arvg)  Fn sin = new Fn()  @Override public double f(double x)  return Math.sin(x); > >; System.out.println("Pi=" + new HalfMidleMethod().getRoot(sin, 4, 7)); > > 

Т.к. java целиком и полностью объектно ориентированный язык, то как следствие в нем нет функций высших порядков. Для передачи функции в качестве аргумента используется интерфейс HalfMidleMethod.Fn .

Источник

Метод бисекции (половинного деления)

Создать иерархию из трех наследующих друг от друга классов:1) класс
статической завершенной функции, 2) класс с защищенным методом решения
задачи и закрытой неизменяемой константой точности вычисления, 3)главный
класс приложения, в котором задаются отрезки функции для поиска .
собственно проблема с 1 классом..

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
public class Function { public double function(double c){ return(double) Math.pow(c,2)-5*Math.pow(c,1)+2; } public double cycl(double x, double y, double z) { double eps=0.001; double a=x; double b=y; while(b-a > eps) { y = b - a; double c = (a+b)/2; if(function(c)>=0) { b=c; } else { a=c; } } return z = ((a+b)/2); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
public class main { public static void main(String args[]) { main function=new main(); Function m=new Function(); double z=0; // m.cycl(0,2,z); System.out.println("Otrezok [0, 2]: "); System.out.println(m.cycl(0,2,z)); System.out.println("Function: "); System.out.println(m.function(m.cycl(0,2,z))); // m.cycl(4,6,z); System.out.println("Otrezok [4, 6]: "); System.out.println(m.cycl(4,6,z)); System.out.println("Function: "); System.out.println(m.function(m.cycl(4,6,z))); } }

Источник

Метод деления отрезка пополам

Метод половинного деления,хорд,ньютона,комбинированный метод
Добрый день. Помогите пожалуйста написать код на Java к функции: X^3 — 50cos(x) с интервалом -4 и.

Не использую операции умножения и деления, найти длину незанятой части отрезка А
1.Даны положительные числа А и В (А>В). На отрезке длины А размещено максимально возможное.

Метод половинного деления (метод деления отрезка пополам)
решите нелинейное уравнение в MS Exel. Метод пропорциональных отрезков (комбинированный метод хорд.

метод деления отрезка по пополам
2.2x −2x =0 Сделайте пожалуйста,если я что то нарушил извиняюсь. можно же задавать такие.

Эксперт Java

ЦитатаСообщение от Merhaba Посмотреть сообщение

Предполагает, что при старте f(a) и f(b) имеют разные знаки. У вас это условие не выполняется.
Код вроде корректный.

Эксперт Java

Merhaba, Да, и поэтому для вашей функции этот метод не подходит. Во всяком случае без дополнительных ухищрений.

Эксперт Java

У меня та же задача — деление отрезка пополам.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
// Метод деления отрезка пополам import java.util.Scanner; class Main{ public static double func(double u) { return u * u * u * u - 5 * u * u * u + 25 * u * u - 3 * u + 8; } public static void main(String[] args) { Main obj = new Main(); System.out.println("Put in a, b, delta, epselon: "); Scanner scan = new Scanner(System.in); double a, b; float delta, epselon; a = scan.nextDouble(); b = scan.nextDouble(); delta = scan.nextFloat(); epselon = scan.nextFloat(); System.out.println("The end of putting in"); int n = 0; double u1, u2, u, J; while(b - a >= epselon) { n = n + 1; u1 = (b + a - delta)/2; u2 = (b + a + delta)/2; if(obj.func(u1)  obj.func(u2)) b = u2; else if(obj.func(u1) > obj.func(u2)) a = u1; else if(obj.func(u1) == obj.func(u2)) { b = u2; a = u1; } u = (b + a)/2; J = obj.func(u); } System.out.println("J = " + J + ", num of iterations - " + n); } }

В предпоследней строке переменная J подчеркивается и компилятор выводит ошибку «Variable «J» might not have been initialized». Отчего это?

ЦитатаСообщение от undergraduate Посмотреть сообщение

от того, что переменная J не инициализирована
в отличии, например, от от n

ЦитатаСообщение от undergraduate Посмотреть сообщение

Источник

Читайте также:  Java date convert offsetdatetime
Оцените статью