jack5211011 2015-04-27 03:15

# C语言数学函数拟合（最小二乘法）

double Step_A, // A参数步长
double Step_B, // B参数步长
double Step_C, // C参数步长
double Range_A_Down, // A参数取值下限
double Range_B_Down, // B参数取值下限
double Range_C_Down, // C参数取值下限
double Range_A_Up, // A参数取值上限
double Range_B_Up, // B参数取值上限
double Range_C_Up, // C参数取值上限
double Sigma_Down // Sigma容忍值下限

int Sigma_Converge_Func( double Step_A,
double Step_B,
double Step_C,
double Range_A_Down,
double Range_B_Down,
double Range_C_Down,
double Range_A_Up,
double Range_B_Up,
double Range_C_Up,
double Sigma_Down)
{
for(A=Range_A_Down;A < Range_A_Up;A += Step_A) // 第一层循环，扫描A参数
{
for(B=Range_B_Down;B < Range_B_Up;B += Step_B) // 第二层循环，扫描B参数
{
for(C=Range_C_Down;C < Range_C_Up;C += Step_C) // 第三层循环，扫描C参数
{
Sigma = 0;
for(int i=0;i<PtsNum;i++)
{
y0[i] = A*x[i]*x[i]+B*x[i]+C;
y1[i] = (y[i]-y0[i])*(y[i]-y0[i]);
Sigma += y1[i];
}
if(Sigma < Sigma_Buff)
{
Sigma_Buff = Sigma;
if(Sigma <= Sigma_Down)
{
return 1;
}
}
else
{
}

``````        }
}
}
return 0;
``````

}

// 第一轮优化，大步长，大范围，进行快速扫描，缩小范围
Sigma_Converge_Func( Step_A0,
Step_B0,
Step_C0,
Range_A_Down0,
Range_B_Down0,
Range_C_Down0,
Range_A_Up0,
Range_B_Up0,
Range_C_Up0,
Sigma_Down0
);
// 第二轮优化，范围适当缩小，-100~+100，步长缩小为1，快速扫描，进一步缩小范围
Range_A_Down0 = A - 100;
Range_A_Up0 = A + 100;
Range_B_Down0 = B - 100;
Range_B_Up0 = B + 100;
Range_C_Down0 = C - 100;
Range_C_Up0 = C + 100;

Step_A0 = 1;
Step_B0 = 1;
Step_C0 = 1;
Sigma_Down0 = 1000;
Sigma_Converge_Func( Step_A0,
Step_B0,
Step_C0,
Range_A_Down0,
Range_B_Down0,
Range_C_Down0,
Range_A_Up0,
Range_B_Up0,
Range_C_Up0,
Sigma_Down0
);
// 第三轮优化，范围十分小，步长为0.1，逐步扫描，直至Sigma趋近于0，暂定为小于1e-9即可
Range_A_Down0 = A - 1;
Range_A_Up0 = A + 1;
Range_B_Down0 = B - 10;
Range_B_Up0 = B + 10;
Range_C_Down0 = C - 10;
Range_C_Up0 = C + 10;

Step_A0 = 0.1;
Step_B0 = 0.1;
Step_C0 = 0.1;
Sigma_Down0 = 1e-9;
if (true == Sigma_Converge_Func( Step_A0, //若Sigma_Converge_Func()的返回值为1，即Sigma<Sigma_Down0，此时的参数最适合
Step_B0,
Step_C0,
Range_A_Down0,
Range_B_Down0,
Range_C_Down0,
Range_A_Up0,
Range_B_Up0,
Range_C_Up0,
Sigma_Down0
))

• 写回答

#### 悬赏问题

• ¥20 C语言字符串不区分大小写字典排序相关问题
• ¥15 关于#python#的问题：我希望通过逆向技术爬取1688搜索页下滑加载的数据
• ¥15 学习C++过程中遇到的问题
• ¥15 关于Linux的终端里，模拟实现一个带口令保护的屏保程序遇到的输入输出的问题！(语言-c语言)
• ¥15 学习C++过程中遇到的问题
• ¥15 请问，这个嵌入式Linux系统怎么分析，crc检验区域在哪
• ¥15 二分类改为多分类问题