首页 > 编程语言 >C# 离散数据拟合曲线

C# 离散数据拟合曲线

时间:2024-10-31 09:33:10浏览次数:5  
标签:Numerics C# double 离散 插值 拟合 var

根据离散数据拟合曲线有多种方法,具体选择取决于数据的性质和拟合的需求。以下是几种常用的方法:

1. 多项式拟合

使用多项式拟合是一种简单且常用的方法,可以使用最小二乘法来拟合数据。

示例代码(C# 使用 Math.NET Numerics 库)

using MathNet.Numerics;
using MathNet.Numerics.LinearRegression;

// 假设 x 和 y 是你的离散数据点
double[] x = { 1, 2, 3, 4, 5 };
double[] y = { 2.2, 2.8, 3.6, 4.5, 5.1 };

// 拟合二次多项式
var p = Polynomial.Fit(x, y, 2);

// 输出拟合结果
for (int i = 0; i < p.Length; i++)
{
    Console.WriteLine($"Coefficient of x^{i}: {p[i]}");
}

2. 样条插值

样条插值(如三次样条插值)适合于需要平滑过渡的情况,能够在每个数据点之间生成光滑的曲线。

示例代码

using MathNet.Numerics.Interpolation;

// 假设 x 和 y 是你的离散数据点
double[] x = { 1, 2, 3, 4, 5 };
double[] y = { 2.2, 2.8, 3.6, 4.5, 5.1 };

// 创建样条插值
var spline = CubicSpline.InterpolateInterpolated(x, y);

// 计算插值点
double interpolatedValue = spline.Interpolate(2.5);
Console.WriteLine($"Interpolated value at x=2.5: {interpolatedValue}");

3. 曲线拟合(非线性)

如果数据呈现非线性特征,可以使用非线性曲线拟合,例如指数拟合、对数拟合等。

示例代码

using MathNet.Numerics;
using MathNet.Numerics.Optimization;

// 假设 x 和 y 是你的离散数据点
double[] x = { 1, 2, 3, 4, 5 };
double[] y = { 2.2, 2.8, 3.6, 4.5, 5.1 };

// 定义拟合函数
Func<double, double, double> model = (a, b) => a * Math.Exp(b * x);

// 定义损失函数
var loss = new Func<Vector<double>, double>(p =>
{
    double a = p[0];
    double b = p[1];
    double sum = 0;
    for (int i = 0; i < x.Length; i++)
    {
        double predicted = model(a, b);
        sum += Math.Pow(predicted - y[i], 2);
    }
    return sum;
});

// 优化参数
var initialGuess = Vector<double>.Build.DenseOfArray(new double[] { 1.0, 1.0 });
var optimizer = new NelderMeadSimplex(1e-9, 2000);
var result = optimizer.FindMinimum(ObjectiveFunction.Value(loss), initialGuess);

4. 使用机器学习模型

如果数据复杂,可以考虑使用机器学习模型(如神经网络)来进行拟合。

选择合适的方法

  • 多项式拟合:适合较简单、单调的离散数据。
  • 样条插值:适合需要平滑曲线的情况。
  • 非线性拟合:适合非线性关系。
  • 机器学习:适合复杂关系或大数据集。

标签:Numerics,C#,double,离散,插值,拟合,var
From: https://www.cnblogs.com/guangzhiruijie/p/18516991

相关文章

  • Scrum中文网研发的工具叫什么
    Scrum中文网研发的工具叫做”敏捷猫”,这是一个基于Scrum理念和敏捷开发方法论所设计的项目管理工具,致力于帮助团队更好地实施敏捷开发,提高工作效率和产品质量。敏捷猫提供了全面的项目管理功能,包括任务创建、分配、跟踪和评估等,使项目管理变得更为简单和直观。Scrum中文网研发......
  • C++多线程应用
    一个进程就是一个程序,一个程序里不止一个功能,每个功能的实现就可以交给一个线程去完成。一个进程就像是一个工程,这个工程里,有设计,有监理,有施工,就相当于三个线程,各干各的又相互配合。https://cplusplus.com/reference/thread/thread/thread/是C++的官方参考,个人觉得比较权威,比经......
  • 16、基于AT89C52的数码电子时钟(带时钟校准、清零功能)proteus仿真设计
    一、仿真原理图:二、仿真效果:三、相关代码:1、主函数:voidmain(void){      SystemInit();   VariableInit();            while(1)        {      if(key==0)      {       ......
  • PbootCMS 留言板调用
    适用范围全站任意地方均可使用标签作用用于用户提交留言和调取留言记录1.留言提交表单html <formaction="{pboot:msgaction}"method="post">联系人:<inputtype="text"name="contacts">手机:<inputtype="text"name="......
  • PbootCMS如何实现上传的文件使用原名称
    打开 \core\function\file.php,找到:$file_ext=strtolower(end($file));//获取扩展在其下一行增加:$file_truename=$file[0];//获取文件真实名称继续在此文件里找到:$file_path=$save_path.'/'.$file_type.'/'.date('Ymd').'......
  • PbootCMS后台ueditor编辑器上传图片如何去掉自动添加的title和alt属性
    修改ueditor.all.min.js文件:打开 \core\extend\ueditor\ueditor.all.min.js 文件搜索 "imageUrlPrefix",找到以下代码:javascript g.setAttribute("title",f.title||"");g.setAttribute("alt",f.original||"");修......
  • Dedecms数据库恢复与备份的两种方法
    使用phpMyAdmin进行备份和恢复备份步骤:登录主机控制面板。点击“数据库管理”->“登录phpMyAdmin”。使用数据库用户名和密码登录。找到要备份的数据库,全选数据表。点击“导出”,选择导出格式(如SQL),点击“执行”。恢复步骤:登录phpMyAdmin。选择要导入的数据库。......
  • 给DedeCMS增加二维码功能
    问题:如何给DedeCMS增加二维码功能?解决方法:修改 extend.func.php 文件:打开 include/extend.func.php 文件,在文件末尾添加以下内容:functionqr_code($id,$size=200){return'https://api.qrserver.com/v1/create-qr-code/?size='.$size.'x'.$size.'&data=&......
  • dedecms模板怎么修改
    问题:如何修改DedeCMS模板。解决方法:进入后台管理:登录DedeCMS后台管理界面。选择模板管理:在后台左侧菜单中选择“模板管理”。选择要修改的模板:在模板列表中找到需要修改的模板文件,点击“修改”按钮。编辑模板文件:在模板编辑页面中,可以直接修改HTML和CS......
  • 织梦 DedeCMS 自定义表单出现“数据校验证不对,程序返回”的解决方案
    问题:自定义表单提交时提示“数据校验不对,程序返回”。解决方法:找到新的 dede_fieldshash 值:打开后台-核心-频道模型-自定义表单。找到设置好的自定义表单,点击“前台预览”。如果提示前台预览关闭,点击“修改”,将“前台列表和内容也公开”选项勾选为“完全公开”......