c# - 图表系列一阶导数
问题描述
我正在绘制一个图表,System.Windows.Forms.DataVisualization.Charting
我已经用一堆 x 和 y 点填充了系列,我也希望能够绘制导数。有谁知道这样做的简单方法?
或者,如果有一种方法可以获得一组 xy 点的相应函数,那也会有帮助。
谢谢你。
系列人口:
chart_TitrationData.ChartAreas[0].AxisX.Title = "Volume (mL)";
chart_TitrationData.ChartAreas[0].AxisY.Title = "pH";
chart_TitrationData.Series.Add(_SelectedTitration.TitrationID);
chart_TitrationData.Series[_SelectedTitration.TitrationID].ChartType = SeriesChartType.Spline;
chart_TitrationData.Series[_SelectedTitration.TitrationID].MarkerStyle = MarkerStyle.Circle;
chart_TitrationData.Series[_SelectedTitration.TitrationID].XValueType = ChartValueType.Double;
chart_TitrationData.Series[_SelectedTitration.TitrationID].YValueType = ChartValueType.Double;
chart_TitrationData.Series[_SelectedTitration.TitrationID].IsVisibleInLegend = true;
foreach (var data in _SelectedTitration.TitrationData)
{
chart_TitrationData.Series[_SelectedTitration.TitrationID].Points.AddXY(data.XPoint, data.YPoint);
}
解决方案
有内置的统计公式,但没有用于导数。甚至在另一个函数类中,金融公式
所以你必须自己计算它们。
对于给定Series s0
的一阶导数,可以从差值中计算:
for (int i = 1; i < s0.Points.Count; i++)
{
s1.Points.AddXY(s0.Points[i].XValue, (s0.Points[i].YValues[0] -
s0.Points[i-1].YValues[0]) / scale);
}
这个简单的测试..:
double scale = 100;
for (int i = 0; i < 1000; i++)
{
s0.Points.AddXY(i, Math.Sin(i / scale));
}
结果,正如预期的那样..:
如果 x 值的间隔不是那么均匀,您应该通过各个步骤潜水来计算完整的差商:
double step = s0.Points[i].XValue - s0.Points[i-1].XValue;
另外:上面是一个轻微的简化。为了获得更好的精度,应该使用 x-step/2 和 x+step/2 作为 x 值以及相应的插值 y 值。并省略 s2 中的第一个和最后一个点。
推荐阅读
- c - C: _access_s() 找不到文件夹
- c# - 将datagridview添加到tabcontrol
- excel - 当 sheet2 中的单元格符合条件时更新 sheet1 - Excel 和 VBA
- git - 在同一堆栈/git/IDE 环境中处理多个项目
- python - 使用 pypandoc 将 html 文件转换为 docx 文件时不保留编号列表
- bash - Bash 命令在终端中运行,但不在脚本文件中
- java - 如何使用 LinkedList 和 ArrayList 衡量性能?
- python - 当函数包含条件时,使用 Numpy 将函数应用于数组
- apache-spark - Spark:加入时设置最大分区大小
- javascript - 缓存未命中问题