我对编程很陌生,刚被一所大学录取。 到目前为止,我已经学习了一些基本的循环,但是问题是如何确定特定功能的最小范围?
情况是这样的: “通过找到a和b来选择第一个间隔,使()∙()<0“
我必须使用的函数是:8−4.5(-sin)= 0
现在我被要求在该函数中输入2个数字并将其相乘。
这里是例子:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double a = sc.nextDouble();
double b = sc.nextDouble();
System.out.println(function(a)*function(b);
public static double function(double x) {
double resultF = 0;
resultF = 8 - (4.5 * (x - Math.sin(x)));
return resultF;
}
我已经为此做了一个课程。
现在的问题是,如果我要输入2(function(a)* function(b))并使其接近于零,该如何找到最小值。
因此,首先要使用户输入2个随机数。然后它们都将必须通过8-4.5(-sin)= 0函数。 计算完数字后,您可以将两个“计算出的数字”都乘以它们。 我在这里尝试做的是尝试建立一个循环,该循环将自动缩短“输入”的间隔,并使它们尽可能接近零。 (参考8-4.5(-sin)= 0函数)
到目前为止,我能做的是:
打包com.company;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double a = sc.nextDouble();
double b = sc.nextDouble();
double resultA = function(a);
double resultB = function(b);
double newA = 0;
double newB = 0;
System.out.println(resultA * resultB);
System.out.println(resultA*resultB);
if (resultA*resultB >=0) {
if(a<b) {
while(function(a)*function(b)>=0) {
newA = a++;
newB = b--;
}
} else if(a > b) {
while(function(a)*function(b)>=0) {
newA = a--;
newB = b++;
}
}
}
}
我知道最小间隔是3和2,但是我不知道如何使循环工作。
感谢您的回复!
感谢大家的帮助! 谢谢
答案 0 :(得分:0)
如果您想获得最短的间隔,要完全回答您的问题,直观的方法是按照如下所示的步骤减少间隔:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double a = sc.nextDouble();
double b = sc.nextDouble();
double step = sc.nextDouble();
if (a > b) {
double tmp = a;
a = b;
b = tmp;
}
double bResult = function(b);
while (function(a) * bResult < 0) {
a += step;
}
a -= step;
double aResult = function(a);
while (aResult * function(b) < 0) {
b -= step;
}
b += step;
System.out.println(a + " " + b);
System.out.println(function(a) + " " + function(b));
sc.close();
}
但是,如果您想获得精确的结果,则步骤很少,那么计算可能会非常漫长...解决方案包括使用Dichotomy。概念很简单:通过将le范围除以2来减小间隔,直到范围小于所需的间隔,如下所示:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double a = sc.nextDouble();
double b = sc.nextDouble();
double step = sc.nextDouble();
if (a > b) {
double tmp = a;
a = b;
b = tmp;
}
while (Math.abs(a - b) > step) {
double mid = (a+b) / 2;
if (function(mid) == 0) {
System.out.println(mid);
return;
}
if (function(a) * function(mid) < 0) {
b = mid;
} else {
a = mid;
}
}
System.out.println(a + " " + b);
System.out.println(function(a) + " " + function(b));
sc.close();
}
希望对您有帮助。