Реализация итерационного метода
При выполнении работы в которой необходимо бюло реализовать метод Ньютона, для нахождения нулей функции, возникла проблема. Компилятор не заходит в метод SOLVE класса Solve_NewthonMethod. Код представлен ниже:
package ItMethods;
import ItMethods.Function;
public class Solve_NewthonMethod {
double Approx;
double E,x,stop;
boolean b1,b2,b3,b4;
double tmp,res;
Function f= new Function(5, 1.8,2.3);
// Выбор начального приближения:
Solve_NewthonMethod(double E) {
// Approx = A;
this.E = E;
for (double i = f.a; i <= f.b; i += this.E) {
if (f.DiffFun1(i) > 0 && f.DiffFun2(i) > 0 || f.DiffFun1(i) < 0 && f.DiffFun2(i) < 0) { //
Approx = f.b;
} else Approx = f.a;
}
}
// ДОСТАТОЧНЫЕ УСЛОВИЯ
// 1е достаточное условие: f(a)*f(b)<0
boolean CheckFun(){
if(f.getFun(f.a)*f.getFun(f.b)<0){
System.out.println("Уравнение точно имеет хотя бы один корень.");
b1=true;
}
return b1;
}
// 2e достаточное условие: x0 должно удовлетворять f(x0)*f``(x0)>0
boolean CheckInApprox() {
if (f.getFun(Approx) * f.DiffFun2(Approx) > 0) {
System.out.println("Верное приближение");
return b2 = true;
} else {
System.out.println("Начальное приближнение не удовлетворяет условию f`(x0)*f``(x0)>0.");
return false;
}
}
//3е достаточное условие: 1я Производная не должна = 0 и должна сохр знак для всех х из промежутка от а до b. В качестве шага взята точность.
boolean CheckDiff(){
for(double i=f.a;i<=f.b;i+=this.E){
if(f.DiffFun1(i)!=0 && (f.DiffFun1(i)>0 || f.DiffFun1(i)<0)){
b3=true;
}
}
return b3;
}
//4е достаточное условие: 2я Производная должна сохранять знак на всем интервале
boolean CheckDiff1() {
for (double i = f.a; i <= f.b; i += this.E) {
if (f.DiffFun2(i) > 0 || f.DiffFun2(i) < 0) {
b4 = true;
}
}
return b4;
}
**void Solve(){
if(b1 && b2 && b3 && b4 ) {
do {
x = Approx - f.getFun(Approx) / f.DiffFun1(Approx);
stop=x-Approx;
Approx=x;
System.out.println(+x);
} while (Math.abs(stop) > E );
// if (x > f.a && x < f.b) {
// System.out.println(+x);
// } else System.out.println("Нет корней на данном интервале.");
}
// System.out.println("Не выполненно одно из достаточных условий!");
}**
}
Класс функции (знаю,что все не оч,но я только начинаю вникать в прогу,поэтому извиняюсь):
package ItMethods;
import ItMethods.Solve_NewthonMethod;
public class Function {
int Pow;
double a, b, temp;
private int counter;
/*
* КОНСТРУКТОР
*/
Function(int Pow, double a, double b) {
if (Pow >= 10 || Pow < 2) return;
this.Pow = Pow;
this.a = a;
this.b = b;
//Замечания:
if (Pow % 2 == 1) System.out.println("Так как старшая степень полинома равна " + Pow + " ,то следует,что полином \n имеет хотя-бы один действительный корень. ");
if (a > b) {
temp = b;
b = a;
a = temp;
}
System.out.println("Интервал: ["+a+";"+b+"]");
}
public double getFun(double InApprox){
return Math.pow(InApprox,Pow)-3*Math.pow(InApprox,Pow-2)-4*Math.pow(InApprox,Pow-3)-2*InApprox+4;
}
public double DiffFun1(double InApprox){
return Pow*Math.pow(InApprox,Pow-1)-3*(Pow-2)*Math.pow(InApprox,Pow-3)-4*(Pow-3)*Math.pow(InApprox,Pow-4)-2;
}
public double DiffFun2(double InApprox){
return Pow*(Pow-1)*Math.pow(InApprox,Pow-2)-3*(Pow-2)*(Pow-3)*Math.pow(InApprox,Pow-4)-4*(Pow-3)*(Pow-4)*Math.pow(InApprox,Pow-5);
}
}
И,наконец-таки,класс для теста:
package ItMethods;
import ItMethods.Solve_NewthonMethod;
import ItMethods.Solve_HalfDiv;
public class TestMethod {
public static void main(String[] args) {
Solve_NewthonMethod a= new Solve_NewthonMethod(0.01);
a.Solve(); // НЕ ВЫВОДИТ
System.out.println(a.CheckDiff()+" "+a.CheckFun()+" "+a.CheckInApprox()+" "+a.CheckDiff1());
//System.out.println(a.Approx);
}
}
Помогите,пожалуйста,разобраться в чем дело. Огромное спасибо за ваше внимание и потраченное время для ответа на данный вопрос!
Ответы (1 шт):
Методы CheckDiff, CheckFun, CheckInApprox, CheckDiff1 сохраняют результаты проверок в соответствующие переменные b1, b2, b3, b4. Метод Solve в свою очередь производит проверку этих переменных и должен быть выполнен после выполнения методов CheckDiff, CheckFun, CheckInApprox, CheckDiff1.
package ItMethods;
public class TestMethod {
public static void main(String[] args) {
Solve_NewthonMethod a =
new Solve_NewthonMethod(0.01);
a.CheckDiff();
a.CheckFun();
a.CheckInApprox();
a.CheckDiff1();
a.Solve();
}
}