Files
LaserFlashTesterControl_jia…/测试Scottplot/ClarkTaylorModel.cs

102 lines
3.5 KiB
C#
Raw Normal View History

2026-01-16 19:25:21 +08:00
using MathNet.Numerics;
using MathNet.Numerics.IntegralTransforms;
using System;
using System.Linq;
using System.Numerics;
namespace Scottplot
{
internal class ClarkTaylorModel
{
public static void Construct()
{
// 1. 生成模拟数据
double[] time = Enumerable.Range(0, 1000).Select(i => i * 0.001).ToArray();
double[] laserPulse = GenerateGaussianPulse(time, 0.05, 0.02);
double[] idealResponse = GenerateIdealResponse(time, 0.2); // 假设真实响应
double[] measuredTemp = Convolve(idealResponse, laserPulse); // 模拟实测数据
// 2. 反卷积
double[] deconvolved = DeconvolveFFT(measuredTemp, laserPulse);
// 3. 计算热扩散率
double tHalf = FindHalfMaxTime(deconvolved, time);
double alpha = CalculateThermalDiffusivity(1e-3, tHalf);
Console.WriteLine($"Thermal Diffusivity: {alpha} m²/s");
}
//生成高斯脉冲
static double[] GenerateGaussianPulse(double[] time, double peakTime, double width)
{
return time.Select(t => Math.Exp(-Math.Pow((t - peakTime) / width, 2))).ToArray();
}
// 生成理想响应(理论模型)
static double[] GenerateIdealResponse(double[] time, double alpha)
{
double d = 1e-3; // 厚度1mm
double t0 = 0.1388 * d * d / alpha; // 理论半峰时间
return time.Select(t => t >= t0 ? Math.Exp(-0.5 * Math.Pow((t - t0) / (0.1 * t0), 2)) : 0).ToArray();
}
// 卷积运算(模拟实测信号)
static double[] Convolve(double[] signal, double[] kernel)
{
int n = signal.Length;
double[] result = new double[n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= i; j++)
{
result[i] += signal[j] * (i - j < kernel.Length ? kernel[i - j] : 0);
}
}
return result;
}
// FFT反卷积含维纳滤波
static double[] DeconvolveFFT(double[] measured, double[] pulse)
{
int n = measured.Length;
Complex[] fftMeasured = new Complex[n];
Complex[] fftPulse = new Complex[n];
for (int i = 0; i < n; i++)
{
fftMeasured[i] = new Complex(measured[i], 0);
fftPulse[i] = new Complex(pulse[i], 0);
}
Fourier.Forward(fftMeasured);
Fourier.Forward(fftPulse);
double noiseLevel = 1e-6;
Complex[] fftIdeal = new Complex[n];
for (int i = 0; i < n; i++)
{
double denom = fftPulse[i].MagnitudeSquared() + noiseLevel;
fftIdeal[i] = fftMeasured[i] * Complex.Conjugate(fftPulse[i]) / denom;
}
Fourier.Inverse(fftIdeal);
return fftIdeal.Select(c => c.Real).ToArray();
}
// 找半峰时间
static double FindHalfMaxTime(double[] response, double[] time)
{
double maxTemp = response.Max();
int halfMaxIndex = Array.FindIndex(response, t => t >= maxTemp / 2);
return time[halfMaxIndex];
}
// 计算热扩散率
static double CalculateThermalDiffusivity(double thickness, double tHalf)
{
return 0.1388 * Math.Pow(thickness, 2) / tHalf;
}
}
}