qt生成八个点绘制二次函数曲线并计算出函数曲线y = a * x^2 + b * x + c a b c 的值并计算出拟合值R2
时间: 2023-12-28 12:03:55 浏览: 84
首先,我们需要使用 Qt 中的 QCustomPlot 库来绘制函数曲线。具体实现步骤如下:
1. 创建一个 QCustomPlot 对象:
```
QCustomPlot *plot = new QCustomPlot(this);
```
2. 设置绘图区域的范围:
```
plot->xAxis->setRange(-10, 10);
plot->yAxis->setRange(-100, 100);
```
3. 生成数据点:
```
QVector<double> x(1001), y(1001);
for (int i = 0; i < 1001; ++i) {
x[i] = i/100.0 - 5;
y[i] = a * x[i] * x[i] + b * x[i] + c;
}
```
这里我们生成了 1001 个数据点,x 轴范围为 -5 到 5,每隔 0.01 个单位取一个点,y 值根据二次函数的公式计算得到。
4. 添加数据到绘图区域:
```
plot->addGraph();
plot->graph(0)->setData(x, y);
```
5. 计算 R2 拟合值:
```
// 计算平均值
double sum_y = std::accumulate(y.constBegin(), y.constEnd(), 0.0);
double mean_y = sum_y / y.size();
// 计算总平方和
double ss_tot = std::inner_product(y.constBegin(), y.constEnd(), y.constBegin(), 0.0);
// 计算残差平方和
double ss_res = std::inner_product(y.constBegin(), y.constEnd(), y.constBegin(), 0.0, std::plus<double>(), [a,b,c](double a, double b){ return pow(a - (a * a + b * a + c), 2); });
// 计算 R2 拟合值
double r_squared = 1.0 - ss_res/ss_tot;
```
这里我们使用了 C++ 中的标准库函数 std::accumulate 和 std::inner_product 来计算平均值、总平方和和残差平方和,最终得到 R2 拟合值。
完整的代码如下:
```
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include "qcustomplot.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow mainWindow;
QCustomPlot *plot = new QCustomPlot(&mainWindow);
mainWindow.setCentralWidget(plot);
plot->xAxis->setRange(-10, 10);
plot->yAxis->setRange(-100, 100);
double a = 1, b = 2, c = 3;
QVector<double> x(1001), y(1001);
for (int i = 0; i < 1001; ++i) {
x[i] = i/100.0 - 5;
y[i] = a * x[i] * x[i] + b * x[i] + c;
}
plot->addGraph();
plot->graph(0)->setData(x, y);
// 计算平均值
double sum_y = std::accumulate(y.constBegin(), y.constEnd(), 0.0);
double mean_y = sum_y / y.size();
// 计算总平方和
double ss_tot = std::inner_product(y.constBegin(), y.constEnd(), y.constBegin(), 0.0);
// 计算残差平方和
double ss_res = std::inner_product(y.constBegin(), y.constEnd(), y.constBegin(), 0.0, std::plus<double>(), [a,b,c](double a, double b){ return pow(a - (a * a + b * a + c), 2); });
// 计算 R2 拟合值
double r_squared = 1.0 - ss_res/ss_tot;
mainWindow.show();
return a.exec();
}
```
阅读全文