二維線性擬合程序的Java實現(xiàn)
????Java編程的一個期末作業(yè),寫完了留在機子上也沒怎么用(畢竟現(xiàn)在大家都直接用excel了),就發(fā)出來希望幫到有需要的人。因為B站專欄的排版問題,直接復(fù)制代碼可能無法正常運行,建議根據(jù)實際情況學(xué)習(xí)。
軟件:eclipse
代碼:
package qi_mo;
//期末作業(yè):用Java編寫程序?qū)崿F(xiàn)以下功能:用戶輸入x,y值,程序自動轉(zhuǎn)換為坐標并獲得二維線性擬合的表達式
//版本v1.0
//未來可添加計算相關(guān)系數(shù)r的方法至程序中,用以判斷線性相關(guān)方程是否合理
import java.util.*;
public class UserIO {
@SuppressWarnings("resource")
/*程序?qū)懲暌院罂吹健? error(s),1 warning(s)”,強迫癥患者表示不能忍受,百度了一下原來是reader會申請內(nèi)
* 存調(diào)用,但是程序結(jié)束后不會自動釋放內(nèi)存,容易造成資源浪費,所以加上這個就好啦!有借有還,再借不難:)
*/
public static void main(String args[])
{ System.out.println("這是一個二維線性擬合程序,輸入x,y坐標以獲得其線性擬合表達式");
System.out.println("請輸入坐標數(shù)目:");
int n; //定義坐標數(shù)目
Scanner reader=new Scanner(System.in);
n=reader.nextInt();
if(n>0) //判斷n是否合理
{ double[] x=new double[n];
double[] y=new double[n];
int i; //定義循環(huán)變量
for(i=0; i<n; i++) //獲取所有坐標
{ System.out.print("請輸入第"+(i+1)+"個坐標的x值:");
x[i]=reader.nextDouble();
System.out.print("請輸入第"+(i+1)+"個坐標的y值:");
y[i]=reader.nextDouble();
}
System.out.println("已完成坐標錄入");
//可于此處加入計算相關(guān)系數(shù)r的方法
double a, b; //定義線性回歸方程的縱截距和斜率
double fenzi, fenmu;
double xba, yba; //定義x和y各自的平均值
for(xba=yba=0, i=0; i<n; i++) //計算x和y各自的平均值
{ xba=(xba*i+x[i])/(i+1);
yba=(yba*i+y[i])/(i+1);
}
for(fenzi=fenmu=0, i=0; i<n; i++) //計算b的分子和分母
{ fenzi=x[i]*y[i]+fenzi;
fenmu=x[i]*x[i]+fenmu;
}
fenzi=fenzi-n*xba*yba; //繼續(xù)計算b的分子和分母
fenmu=fenmu-n*xba*xba;
b=fenzi/fenmu; //求a和b
a=yba-b*xba;
if(a>=0) //判斷縱截距是否大于等于零以確定輸出的方式
System.out.print("待求的線性回歸方程是:y="+b+"x+"+a);
else
System.out.print("待求的線性回歸方程是:y="+b+"x"+a);
}
else System.out.print("非法數(shù)據(jù)");
}
}



