1. 程式人生 > >java 求一元分段函式積分對應的x值

java 求一元分段函式積分對應的x值

形如這裡寫圖片描述這樣的一元分段函式,已知這裡寫圖片描述,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; } }