c语言-C语言数学函数拟合(最小二乘法)

问题描述

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
))

思路和问题:(题目:通过10个已知坐标和函数模型(带3个参数)拟合出原函数)
对于函数原型y=A*x^2+B*x+C来说,假设A,B,C三个参数是从-1000到1000,本来我打算设置0.1的步长,从-1000扫描到1000,可是这样的话三层循环都是从-1000到1000以0.1的步长扫描参数,太慢了,然后我就想设定一个Sigma的容忍值,第一次扫描到Sigma<(一个值)就退出二乘法函数,然后重新在得到的大概的A,B,C参数值附近再进行下一步扫描,然后继续缩小Sigma的值,再重复一次,直至Sigma逼近0,这也就是说A,B,C参数就是我想要的值。
但是这个方法有问题,当我换一个函数模型时,程序就不行了,好比说,A,B,C正确值分别是A=5,B=20,C=-35,可是我在第一次扫描时得到Sigma<(一个值)时的A=-20,B=40,C=-30,那么程序会自动在这个附近进行下一次扫描,比如说在A=-30~-10之间进行扫描,B,C以此类推,但是这远远偏离了正确值,需要重新手动调整扫描范围才能让结果趋向于正确值。
请问该怎么办,我想不出好的解决办法。谢谢大家!

时间: 2024-09-16 03:28:34

c语言-C语言数学函数拟合(最小二乘法)的相关文章

《R的极客理想——高级开发篇 A》一一第1章 R语言知识体系和数学函数

第1章 R语言知识体系和数学函数 本章为全书开篇,主要介绍了R语言知识体系结构及学习资料.利用R语言实现数学计算和统计计算以及连续型分布函数的可视化,可帮助读者全面理解R语言,并利用R语言快速地处理基础学科的计算问题.

《Python语言程序设计》——第3章数学函数、字符串和对象3.1 引言

第3章 数学函数.字符串和对象 学习目标 使用math模块中的函数解决数学问题(第3.2节). 表示和处理字符串和字符(第3.3-3.4节). 使用ASCII和Unicode对字符编码(第3.3.1-3.3.2节). 使用ord函数获取一个字符的数值编码以及使用chr函数将一个数值编码转换成一个字符(第3.3.3节). 调用带参数end的print函数(第3.3.5节). 使用str函数将数字转换成字符串(第3.3.6节). 使用运算符+来连接字符串(第3.3.7节). 从键盘读取字符串(第3.

c语言程序题-C语言程序设计题,函数,二维数组

问题描述 C语言程序设计题,函数,二维数组 某班期末考试科目为数学,英语,物理,有最多不超过30人参加考试,编写程序实现成绩排序和成绩查询 要求①用函数编程实现计算每个学生的总分和平均分 ②用函数编程实现按总分成绩由高到低排出成绩名次 ③用函数编程打印出名次表,表格内包括学生编号,各科分数,总分和平均分 解决方案 你不会自己写???逗我?? 解决方案二: 好好写作业.........不要偷懒 解决方案三: 自己写吧,小伙子!!! 解决方案四: 建议楼主自己写吧,写好了碰到问题再发上来 解决方案五

c语言-C语言:在子函数中修改结构变量中元素的值

问题描述 C语言:在子函数中修改结构变量中元素的值 要写一个处理学生成绩信息的程序,使用单向链表,创建,遍历已经没有问题,但在修改结点的数据时出现问题,输入数据后程序就停止运行. 修改的思路是先根据学号定位到指定结点,然后修改数据,修改函数如下 void Correct(float *a,float *b,float *c,float *d,float *e,float *f) { printf("请依次输入学生正确的的英语 数学 物理 C语言成绩n"); scanf("%f

【Go语言】【11】GO语言的包和函数

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://qingkechina.blog.51cto.com/5552198/1665234 还记得<[2]Sublime配置GO开发环境>的入门例子吗? 当然不记得了:)  这篇文章距离上篇时间太久远了,遥远的我都快忘记了.还是把截图贴上吧 该例子中的func main()表示这是一个名称叫main的方法,而package main表示这个方法在main包内,这两部分的内容就是本节要

《R的极客理想——高级开发篇 A》一一1.2 R语言中的数学计算

1.2 R语言中的数学计算 问题 如何用R语言进行数学计算? 引言 R语言是统计语言,生来就对数学有良好的支持,用R语言做数学的计算题特别方便.如果计算器中能嵌入R语言的计算函数,那么绝对是一种高科技产品.我真的把R语言当成我的计算器了!1.2.1 基本计算 R语言对数学计算有着非常好的支持,本节将完整介绍初等数学中的各种计算操作. 本节的系统环境是: Windows 7 64bit R: 3.1.1 x86_64-w64-mingw32/x64 (64-bit) 用R语言实现四则运算操作,包括

《R语言数据分析与挖掘实战》——3.3 R语言主要数据探索函数

3.3 R语言主要数据探索函数 R提供了大量的与数据探索相关的函数,这些数据探索函数可大致分为统计特征函数与统计作图函数.本小节对R中主要的统计特征函数与统计作图函数进行介绍,并举例以方便理解. 3.3.1 统计特征函数 统计特征函数用于计算数据的均值.方差.标准差.分位数.相关系数.协方差等,这些统计特征能反映出数据的整体分布.本小节所介绍的统计特征函数如表3-7所示. (1)mean 功能:计算数据样本的算术平均数. 使用格式: 计算样本X的均值n,样本X可为向量.矩阵或多维数组. (2)e

c语言-C语言选择法排序函数的实现问题

问题描述 C语言选择法排序函数的实现问题 我在看C语言程序设计是遇到一个问题,用选择法对数组中的5个整数按由小到大排序 #include int main() { void sort(int array[],int n); int a[5],i; printf("Please input 5 numbers:n"); for(i=0;i<5;i++) scanf("%d",&a[i]); sort(a,5); printf("the sort

C语言中字符串常用函数strcat与strcpy的用法介绍

以下是对C语言中字符串常用函数strcat与strcpy的使用方法进行了详细的分析介绍,需要的朋友可以参考下   strcpy原型声明:extern char *strcpy(char* dest, const char *src);头文件:#include <string.h>功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串. 返回指向dest的指针.函数实现: 复制代