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;
}
}

manylinux
- 粉丝: 4762
- 资源: 2901
最新资源
- 基于 Vite、Vue3 和 TypeScript 的 UniApp 起始模板
- 基于事件触发机制的数据驱动连续时间非线性系统有限时域H∞跟踪控制
- 汽车安全评估中的电子油门控制系统研究及应用(汽油车)
- uniapp的学习完整版PDF
- 高维数据中去稀疏化套索和双重选择方法的性能对比与应用
- 定期体检,智能清理,C盘空间无忧
- 深度学习基础-个人总结(必会技能和知识点).md
- 全球气候,温度等方面的数据集
- 基于胶囊网络和自定义特征提取层的深度学习数字调制信号分类器
- C语言+简易版拷贝复制+linux操作系统
- XXL-JOB 2.4.0适配postgres数据库
- 基于python开发的一个多模态智能双足轮式人形机器人,结合语音、视觉和手势识别技术,实现智能交互和动作编排 机器人可以通过语音指令进行控制,并执行预定义的动作序列 (源码+教程)
- 基于OSEK规范的汽车电子嵌入式实时操作系统设计与实现
- 气候,温度方面的数据集
- 强化学习赋能深度推理:DeepSeek-R1及Kimi 1.5强推理模型的技术解析与发展前景
- 基于Pytorch的生成对抗网络研究PDF
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


