2015-12-26 4 views
1

Я пытаюсь реализовать метод деления пополам для нахождения решений уравнения.Как найти решение уравнений на основе метода деления пополам

Форма уравнения, как это:
ре^(- х) + д Sin (х) + г сов (х) + с тангенс (х) + т х^2 + и = 0, где 0 ≤ p, r ≤ 20, -20 ≤ Q, S, T ≤ 0 ≤ -20 е U ≤ 20

ввода, например:

1. 0 0 0 0 - 2 1
1 0 0 0 -1 2
1 -1 1 -1 -1 1

должен дать:

0,7071
невыполним
0,755

Я пытался осуществить это, но я не могу показать результат с 4 знаками после запятой, и я понял, что абы и с в виде xx с одним десятичным знаком. Я думаю, что проблема начинается здесь. Любая помощь будет очень оценена. Вот мой код

class p07{ 
public static void main(String [] args){ 
    Scanner in = new Scanner(System.in); 
    int n= in.nextInt(); 

    for (int i=0 ; i < n; i++) 
     bss(in.nextInt(), in.nextInt(),in.nextInt(), in.nextInt(),in.nextInt(), in.nextInt()); 

} 

public static void bss(int p, int q, int r, int s, int t, int u){ 
    double fa=0, fb=0, fc=0; 

    boolean flag=true; 

    double a=-20; 
    double b=a; 

    while(flag){ 

     fa=p*Math.exp(a) + q*Math.sin(a) + r*Math.cos(a) + s*Math.tan(a) + t*Math.pow(a,2) + u; 
     fb=p*Math.exp(b+1) + q*Math.sin(b+1) + r*Math.cos(b+1) + s*Math.tan(b+1) + t*Math.pow(b+1,2) + u; 

     a++;b++; 

     if((fa < 0 && fb > 0) || (fa > 0 && fb < 0)) 
      flag=false; 
    } 

    System.out.println("a= "+a+", b= "+b); 
    System.out.println("f(a)= "+fa+", f(b)= "+fb); 

    int k=4; 
    double c=0.000; 

    while(k!=0){ 

     c = (a+b)/2; 
     fa = p*Math.exp(a) + q*Math.sin(a) + r*Math.cos(a) + s*Math.tan(a) + t*Math.pow(a,2) + u; 
     fc = p*Math.exp(c) + q*Math.sin(c) + r*Math.cos(c) + s*Math.tan(c) + t*Math.pow(c,2) + u; 

     if(fa < fc) 
      b=c; 
     else 
      a=c; 
     k--; 
     System.out.println("a= "+a+",b= "+b+", c= "+c); 
    } 
    double sol =p*Math.exp(c) + q*Math.sin(c) + r*Math.cos(c) + s*Math.tan(c) + t*Math.pow(c,2) + u; 
    System.out.println(sol); 
} 

}

+0

Так просто быть ясно, что вы ищете корни уравнения? Потому что я думаю, что в математике существует более одного метода «биссектрисы». Каков первоначальный интервал для поиска? Я не понимаю, где это находится на вашем входе. – markspace

+0

да @markspace корни –

ответ

0

некоторые ошибки:

третий одно не сходится.

  • плохого тест: вы должны проверить, если фа и Ь имеют разные знаки => если (фа * Ь < 0)
  • Вы должны также проверить, если вы получаете ОСНОВОПОЛАГАЮЩУЮ
  • Я УПРОЩЕННЫЙ свой первый тест с перерыв
  • золь не является решением, но е (псевдо-корень)

Я не понимаю вашу проблему о десятичных знаков: а, Ь, с двойником.

Я заменяю петлю на 10 итераций.

так, это дает:

double fa=0, fb=0, fc=0; 

double a=-20; 
double b=a+1; 

while(true) 
    { 
    fa=p*Math.exp(a) + q*Math.sin(a) + r*Math.cos(a) + s*Math.tan(a) + t*Math.pow(a,2) + u; 
    fb=p*Math.exp(b) + q*Math.sin(b) + r*Math.cos(b) + s*Math.tan(b) + t*Math.pow(b,2) + u; 

    if((fa < 0 && fb > 0) || (fa > 0 && fb < 0)) 
     break; 

    a++;b++; 
    } 

System.out.println("a= "+a+", b= "+b); 
System.out.println("f(a)= "+fa+", f(b)= "+fb); 

int k=10; 
double c=0.0; 

while(k!=0) 
    { 

    c = (a+b)/2; 
    fa = p*Math.exp(a) + q*Math.sin(a) + r*Math.cos(a) + s*Math.tan(a) + t*Math.pow(a,2) + u; 
    fc = p*Math.exp(c) + q*Math.sin(c) + r*Math.cos(c) + s*Math.tan(c) + t*Math.pow(c,2) + u; 

    // ROOT 
    if (fc==0) break; 

    if (fa*fc<0) 
     b=c; 
    else 
     a=c; 

    k--; 
    System.out.println("a= "+a+",b= "+b+", c= "+c+" f(c)"+fc); 
} 
double sol =p*Math.exp(c) + q*Math.sin(c) + r*Math.cos(c) + s*Math.tan(c) + t*Math.pow(c,2) + u; 
System.out.println("root="+c);