package com.firefly.fit;
/**
* 拟合数据
*/
public class Fit {
//数组除以一个数
private static double[] arrDiv(double[] divisor,double dividend){
int i;
double[] retVal=new double[divisor.length];
for(i=0;i<retVal.length;i++){
retVal[i]=divisor[i]/dividend;
}
return retVal;
}
//数组乘以一个数
private static double[] arrMult(double[] a,double b){
int i;
double[] retVal=new double[a.length];
for(i=0;i<retVal.length;i++){
retVal[i]=a[i]*b;
}
return retVal;
}
//数组相减
private static double[] arrSub(double[] a,double[] b){
int i;
double[] retVal=new double[a.length];
for(i=0;i<retVal.length;i++){
retVal[i]=a[i]-b[i];
}
return retVal;
}
//将X,Y一维数组经过导数函数计算后组成二维数组
private static double[][] matrix(double[] xVal,double[] yVal,int paramLen){
int m;//数组长度
double[] x;
double[] yx;
int xLen,yxLen;
int i,j;
xLen=(paramLen-1)*2+1;
yxLen=paramLen;
x=new double[xLen];
yx=new double[yxLen];
m=xVal.length;
x[0]=m;
for(i=1;i<x.length;i++){
for(j=0;j<xVal.length;j++){
x[i]=x[i]+Math.pow(xVal[j],i);
}
}
for(i=0;i<yx.length;i++){
for(j=0;j<yVal.length;j++){
yx[i]=yx[i]+yVal[j]*Math.pow(xVal[j],i);
}
}
//后面增加1列,这一列是为了放Y的值
double[][] retVal=new double[paramLen][paramLen+1];
for(i=0;i<paramLen;i++){
for(j=0;j<paramLen;j++){
retVal[i][j]=x[xLen-1-i-j];
}
retVal[i][paramLen]=yx[yxLen-1-i];
}
return retVal;
}
//高斯消元法解方程,将导数函数的二维数组解出abcde参数
private static double[] gauss(double[][] matrix){
int i,j;
//正向消元,从第0行到最后进行消元
for(i=0;i<matrix.length;i++){
matrix[i]=arrDiv(matrix[i],matrix[i][i]);//将第i行的每个元素都除以第i个数
//计算第i行以下的所有行
for(j=i+1;j<matrix.length;j++){
matrix[j]=arrSub(
matrix[j],
arrMult(matrix[i],matrix[j][i])
);
}
}
//反向消元,从后面一直到0行
for(i=matrix.length-1;i>=0;i--){
for(j=i-1;j>=0;j--){
matrix[j]=arrSub(
matrix[j],
arrMult(matrix[i],matrix[j][i])
);
}
}
//经过上面的消元法后,剩下的每行的最后一个元素就是a、b、c....的拟合参数
double[] retVal=new double[matrix.length];
for(i=0;i<matrix.length;i++){
//返回每行的最后一个元素
retVal[i]=matrix[i][matrix[i].length-1];
}
return retVal;
}
/**
* 计算拟合参数
* @param xVal
* @param yVal
* @param paramLen
* @return
*/
public static double[] calcFitParams(double[] xVal,double[] yVal,int paramLen){
//经过导数处理后的二维数组
double[][] matrixVal=matrix(xVal,yVal,paramLen);
//返回拟合参数
return gauss(matrixVal);
}
//拟合数据
public static double fitVal(double[] param,double val){
int i;
int paramLen;
double retVal=0;
paramLen=param.length;
for(i=0;i<paramLen;i++){
retVal=retVal+param[i]*Math.pow(val,paramLen-i-1);
}
return retVal;
}
//拟合曲线
public static double[] fitVals(double[] param,double[] val){
int i;
double[] retVal=new double[val.length];
for(i=0;i<val.length;i++){
retVal[i]=fitVal(param,val[i]);
}
return retVal;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于Java高斯消元法实现的多项式拟合参数训练和数据拟合(源码).rar
共2个文件
java:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 125 浏览量
2023-03-27
20:40:09
上传
评论
收藏 3KB RAR 举报
温馨提示
1、资源内容:基于Java高斯消元法实现的多项式拟合参数训练和数据拟合(源码).rar 2、适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用。 3、更多仿真源码和数据集下载列表(自行寻找自己需要的):https://blog.csdn.net/m0_62143653?type=download 4、免责声明:本资源作为“参考资料”而不是“定制需求”不一定能够满足所有人的需求,需要有一定的基础能够看懂代码,能够自行调试,能够自行添加功能修改代码。由于作者大厂工作较忙,不提供答疑服务,如不存在资源缺失问题概不负责,谢谢理解。
资源推荐
资源详情
资源评论
收起资源包目录
基于Java高斯消元法实现的多项式拟合参数训练和数据拟合(源码).rar (2个子文件)
基于Java高斯消元法实现的多项式拟合参数训练和数据拟合(源码)
test
Main.java 2KB
com
firefly
fit
Fit.java 4KB
共 2 条
- 1
资源评论
- 李老穷2024-06-13资源是宝藏资源,实用也是真的实用,感谢大佬分享~
Matlab仿真实验室
- 粉丝: 4w+
- 资源: 2432
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功