Метод половинного деления
Подскажите, пожалуйста, почему ничего не выводится на консоль. Необходимо реализовать алгоритм, который представлен на рисунке.
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) класс статической завершенной.
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))); } }
Сообщение от Danil178
Catstail, у экспоненты x должен быть отрицательным.
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 = 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))); } }
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? корень должен находиться в интервале, где функция не меняет свой знак, я правильно понимаю?
Сообщение от 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 Сделайте пожалуйста,если я что то нарушил извиняюсь. можно же задавать такие.
Сообщение от Merhaba
Предполагает, что при старте f(a) и f(b) имеют разные знаки. У вас это условие не выполняется.
Код вроде корректный.
Merhaba, Да, и поэтому для вашей функции этот метод не подходит. Во всяком случае без дополнительных ухищрений.
У меня та же задача — деление отрезка пополам.
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