程序地带

WPF 牛顿多项式插值和三次样条插值法的简单实现


折腾不少时间


牛顿插值法主要是在于差商,三次样条主要矩阵,发现自己不会,又回头整矩阵的,什么线性方程的解法..简直头大


牛顿的差商,其实就是递归,虽然计算一次是可以用数组存起来,但是写出来的时候是递归感觉很爽,就灭有存储各阶段的结果,导致计算量大增,应该有个N方的时间把...


剩下就是三次样条,对于公式来看起来也是很简单,但是坑不少,到计算的时候发现自己不会矩阵,回头整了矩阵,发现解法不是求逆或者伴随矩阵这样的计算量极大的方法,而是三角分解,LUP分解或者追赶法等。


所以三次样条除去自身对边界条件的处理,剩下就是矩阵计算了。特别的,三次样条在用的时候不是按段输入值,而是直接输入值,所以做了下对输入值的进行查找段的方法,就是判断输入的值属于哪两个相邻的X点之间。


简单弄了demo。代码上没什么好说的,有不对请指出


示例图片



 


控制代码


public ICommand DrawTypeCommand
{
get
{
return new ParameterCommand<InterpolationFunction>((a) =>
{
IsDrawing = true;
//筛选为鼠标创建的点
var pointlist = MainData.Where(x => x.UIType == CoorDinateUIType.Point).ToList();
var copyarry = new CoorDinate[pointlist.Count()];
pointlist.CopyTo(copyarry, 0);
//创建对应的插值方法
interpolation = InterpolationOperate.Function(copyarry.ToList(), a);
//是否添加过直线
if (!MainData.Any(x => x.UIType == CoorDinateUIType.Line))
{
MainData.Add(new CoorDinate(CreateLine(copyarry.ToList()), CoorDinateUIType.Line));
}
//依次删除插值方法产生的点
for (int i = 0; i < MainData.Count; i++)
{
if (MainData[i].UIType == CoorDinateUIType.MethodPoint)
{
MainData.RemoveAt(i);
i = 0;
continue;
}
}
switch (a)
{
case InterpolationFunction.拉格朗日插值法:
case InterpolationFunction.牛顿多项式插值法:
for (double i = copyarry[0].X; i < copyarry.Last().X; i++)
{
MainData.Add(new CoorDinate(i, interpolation.GetValueByFunction(i), CreateEllipse2(), CoorDinateUIType.MethodPoint));
}
break;
case InterpolationFunction.三次样条自然条件插值法:
for (int i = 0; i < copyarry.Length - 1; i++)
{
var now = copyarry[i].X;
var next = copyarry[i + 1].X;
for (double z = now; z < next; z++)
{
MainData.Add(new CoorDinate(z, interpolation.GetValueByFunction(z), CreateEllipse2(), CoorDinateUIType.MethodPoint));
}
}
break;
default:
break;
}
IsDrawing = false;
ReDraw = true;
}, (a) => !IsDrawing && MainData.Count > 3);
}
}

 


 


 


代码下载


 


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/T-ARF/p/14199454.html

随机推荐

包含min函数的栈

题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用min、push及pop的时间复杂度都是O(1)。链接ÿ...

903419 阅读(322)

Flutter json 2 model with Built Value

Flutterjson2modelwithBuiltValueFlutter中json转换model,除了手动转之外,就是利用第三方库做一些代码生成.流行的库有:json_serializable和b...

圣骑士wind 阅读(619)

占用内存_一个 Java 对象占用多大内存空间

占用内存_一个 Java 对象占用多大内存空间

这个问题一般会出现在稍微高端一点的Java面试环节。要求面试者不仅对Java基础知识熟悉,更重要的是要了解内存模型。Java对象模型HotSpotJVM使用名为oops(Ordinary...

Cossea 阅读(273)

安装dcoker版的gitlab

安装dcoker版的gitlab

1.下载镜像dockerpullbeginor/gitlab-ce:11.0.1-ce.02.创建文件夹通常会将GitLab的配置(etc)、日志(log)、数据(data)放到容器之外,...

jy02268879 阅读(777)

占用内存_每日一博|mariadb 内存占用优化

占用内存_每日一博|mariadb 内存占用优化

点击右上方,关注开源中国OSC头条号,获取最新技术资讯本文由云+社区发表作者:工程师小熊摘要:我们在使用mariadb的时候发现有时候不...

春梅狐狸 阅读(331)

从0系统学Android--5.2 发送广播

从0系统学Android--52发送广播本系列文章目录:更多精品文章分类本系列持续更新中....初级阶段内容参考《第一行代码》5.3发送自定义广播前面已经学习了如何接受广播了,下面来学习如何发送自定义...

sydMobile 阅读(209)