这是我的代码,然后我想用PNUplot去画图,但是总是出现这个问题,说什么line 102 :invalid command,而且也Punplot里也啥都没有,之前简单画个正弦函数还是可以的,老师们求教
#include <iostream>
#include <cmath>
#include <vector>
#include <cstdlib>
#include <gnuplot-iostream.h>
struct Vector3D {
double x, y, z;
Vector3D operator+(const Vector3D& other) const {
return { x + other.x, y + other.y, z + other.z };
}
Vector3D operator*(double scalar) const {
return { x * scalar, y * scalar, z * scalar };
}
void print() const {
std::cout << "(" << x << ", " << y << ", " << z << ")\n";
}
};
double J0(double x)
{
return _j0(x);
}
double J1(double x)
{
return _j1(x);
}
const double pi = 3.14159265358979323846;
const double c = 3e8;
const double epsilon0 = 8.854187817e-12;
const double lambda0 = 1.5e-6;//波长
const double k0 = 2 * pi / lambda0;
const double n0 = 1.4682; // 介质的折射率
const double np = 1.0; // 粒子的折射率
const double r0 = 4.15e-6; // 光纤半径
const double kappa = 3.9e-12; // 耦合系数
const double E0 = 1.0; // 电场强度
Vector3D calculatePoyntingVector(double r, double phi, double delta)
{
double Knew = k0 * n0 * sqrt(2.0 + 2.0 * sin(phi));
double u0 = k0 * n0;
double numerator = Knew * r0 * J0(u0 * r0) * J1(Knew * r0) - u0 * r0 * J1(u0 * r0) * J1(Knew * r0);
double denominator = Knew * Knew - u0 * u0;
double fraction = numerator / denominator;
double S_scalar = (pi * pow(k0, 3) * c * pow(kappa, 2) * pow(E0, 2)) / (4 * r * epsilon0) * pow(fraction, 2) * pow(sin(delta - phi), 2);
Vector3D S_vector = { r, phi, S_scalar };
return S_vector;
}
int main() {
// 初始化 gnuplot-iostream 的 Gnuplot 实例
Gnuplot gp;
// 设置 r 和 z 的范围和步长
const double r_min = -100e-6, r_max = 100e-6, r_step =2e-6;
const double z_min = 0, z_max = 600e-6, z_step = 2e-6;
// 生成数据,这里我们用二维向量存储 (r, z, TotalS_z)
std::vector<std::vector<std::tuple<double, double, double>>> matrix;
for (double z = z_min; z <= z_max; z += z_step) {
std::vector<std::tuple<double, double, double>> row;
for (double r = r_min; r <= r_max; r += r_step) {
double phi;
if (r == 0) {
phi = 0; // 当 r 等于 0 时,phi 应设置为合理的默认值
}
else {
// 确保 acos 的参数在 [-1,1] 范围内
double value = z / (r * 1.0000);
if (value > 1.0) value = 1.0;
if (value < -1.0) value = -1.0;
phi = acos(value);
}
Vector3D S1 = calculatePoyntingVector(r, phi, 0);
Vector3D S2 = calculatePoyntingVector(r, phi, pi / 2);
double TotalS_z = S1.z + S2.z;
// 检查 TotalS_z 是否是 NaN 或 Inf
if (std::isnan(TotalS_z) || std::isinf(TotalS_z)) {
TotalS_z = 0;
}
row.push_back(std::make_tuple(z, r, TotalS_z));
}
matrix.push_back(row);
}
// 发送数据到 GNUplot
gp << "set pm3d map\n";
gp << "set palette defined (0 'blue', 1 'green', 2 'yellow', 3 'red')\n";
gp << "set cbrange [*:*]\n"; // 让 GNUplot 自动确定最佳范围
gp << "set xlabel 'z (um)'\n";
gp << "set ylabel 'r (um)'\n";
gp << "splot '-' using 1:2:3 with pm3d title 'Energy density flow'\n";
// 每行后加一个空行
for (const auto& row : matrix) {
gp.send1d(row);
gp << "\n";
}
gp << "e\n";
// 完成数据发送
return 0;
}