如何根据二分法求方程的解
how to find solution of equations based on bisection method
我正在尝试实现二分法来求方程的解。
等式的形式是这样的:
pe^(-x) + qsin(x) + rcos(x) + stan(x) + tx^2 + u = 0 ,其中 0 ≤ p,r ≤ 20, -20 ≤ q,s,t ≤ 0 e -20 ≤ u ≤ 20
输入示例:
3
1. 0 0 0 0 -2 1
1 0 0 0 -1 2
1 -1 1 -1 -1 1
应该给:
0.7071
不可能
0.7554
我试图实现这个但是我无法显示小数点后四位的结果,我意识到a b 和c 是x.x 只有一位小数的形式。我认为问题从这里开始。任何帮助将不胜感激。这是我的代码
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);
}
}
一些错误:
第三个不收敛
- 糟糕的测试:你应该测试 fa 和 fc 是否有不同的符号=> if (fa*fc<0)
- 你也应该测试一下你是否获得了 root
- 我用休息时间简化了你的第一个测试
- sol 不是解,而是 f(pseudo-root)
我不明白你关于小数的问题:a、b、c 是双精度的。
我用 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);
我正在尝试实现二分法来求方程的解。
等式的形式是这样的:
pe^(-x) + qsin(x) + rcos(x) + stan(x) + tx^2 + u = 0 ,其中 0 ≤ p,r ≤ 20, -20 ≤ q,s,t ≤ 0 e -20 ≤ u ≤ 20
输入示例:
3
1. 0 0 0 0 -2 1
1 0 0 0 -1 2
1 -1 1 -1 -1 1
应该给:
0.7071
不可能
0.7554
我试图实现这个但是我无法显示小数点后四位的结果,我意识到a b 和c 是x.x 只有一位小数的形式。我认为问题从这里开始。任何帮助将不胜感激。这是我的代码
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);
}
}
一些错误:
第三个不收敛
- 糟糕的测试:你应该测试 fa 和 fc 是否有不同的符号=> if (fa*fc<0)
- 你也应该测试一下你是否获得了 root
- 我用休息时间简化了你的第一个测试
- sol 不是解,而是 f(pseudo-root)
我不明白你关于小数的问题:a、b、c 是双精度的。
我用 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);