java 求一元分段函式積分對應的x值
阿新 • • 發佈:2018-10-31
形如這樣的一元分段函式,已知,c是一個常數,,求xm的值。
函式的資料結構
public class FunctionUnit {
private double k,b;
double XStart,XEnd;
public FunctionUnit(double k,double b,double XStart,double XEnd){
this.k=k;
this.b=b;
this.XStart=XStart;
this.XEnd=XEnd;
}
public double getB() {
return b;
}
public void setB(double b) {
this.b = b;
}
public double getXEnd() {
return XEnd;
}
public void setXEnd(double xEnd) {
XEnd = xEnd;
}
public double getK() {
return k;
}
public void setK(double k) {
this .k = k;
}
public double getXStart() {
return XStart;
}
public void setXStart(double xStart) {
XStart = xStart;
}
}
演算法
public class OneFunctionevaluation {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<FunctionUnit> fun=new ArrayList<FunctionUnit>();
Scanner sc=new Scanner(System.in);
double xn=sc.nextDouble();//給定的起始定義域
double c=sc.nextDouble();//函式積分結果
double xm=evaluation(fun,xn,c);
}
public static double evaluation(List<FunctionUnit> fun,double xn,double c){
double value=0;
double xm=0;
for(int i=0;i<fun.size();i++){//
if(fun.get(i).getXStart()<=xn&&xn<fun.get(i).getXEnd()){//判斷xn在那個定義域區間
double k=fun.get(i).getK();//該區間函式的斜率
double b=fun.get(i).getB();//該區間函式的截距
double endx=fun.get(i).getXEnd();//該區間末尾值
value=0.5*k*(endx*endx-xn*xn)+b*(endx-xn);//計算xn到endx對應函式的積分
//比較xn到endx對應函式的積分值與c的大小
if(value>c){//說明xm在這個區間內
//一元函式的原函式是二元函式,根據解二元方程式可以得到兩個結果
double x1=(-b+Math.sqrt(b*b-4*0.5*k*(c-0.5*xn*xn*k-b*xn)))/2*0.5*k;
double x2=(-b-Math.sqrt(b*b-4*0.5*k*(c-0.5*xn*xn*k-b*xn)))/2*0.5*k;
if(xn<x1&&x1<endx){//判斷哪個值在[xn,endx]區間內
xm=x1;
}else{
xm=x2;
}
}else if(value==c){//說明該區間末尾值
xm=endx;
}else{//說明xm不在該區間,開始計算下一個區間
c=c-value;
xn=endx;
}
}
}
return xm;
}
}