Проблема с синтаксисом формулы
Запрограммировал
Код:
public static Complex reverstrans(double U, double anguarFrequency, double T,int frc,int frc1)///Обратное преобразование Фурье
{
NumericalIntegration integration = new NumericalIntegration();
Complex u1 = GetSpectralDensity(U, anguarFrequency, T);//U'(w)
Complex u2 = GetSpectralDensity(U, anguarFrequency, T);//U''(w)
return (1 / (2 * Math.PI)) * u1.Real * integration.Calculate(t => Math.Cos(anguarFrequency * t), -314, 314) + (Complex.ImaginaryOne / (2 * Math.PI)) * u2.Imaginary * integration.Calculate(t => Math.Sin(anguarFrequency * t), -314, 314);
}
{
NumericalIntegration integration = new NumericalIntegration();
Complex u1 = GetSpectralDensity(U, anguarFrequency, T);//U'(w)
Complex u2 = GetSpectralDensity(U, anguarFrequency, T);//U''(w)
return (1 / (2 * Math.PI)) * u1.Real * integration.Calculate(t => Math.Cos(anguarFrequency * t), -314, 314) + (Complex.ImaginaryOne / (2 * Math.PI)) * u2.Imaginary * integration.Calculate(t => Math.Sin(anguarFrequency * t), -314, 314);
}
Метод Calculate это подсчёт интеграла,а метод GetSpectralDensity эт подсчёт плотности
Код:
interface NumericalIntegrationRule
{
double Calculate(Func<double, double> func, double min, double max, double subintervalsCount);
}
class NumericalIntegration
{
public readonly NumericalIntegrationRule DefaultRule = null;
public readonly int DefaultSubintervalsCount = 100;//100000
public NumericalIntegration()
{
DefaultRule = new TrapezoidalRule();
}
public NumericalIntegration(NumericalIntegrationRule defaultRule)
{
DefaultRule = defaultRule;
}
public NumericalIntegration(NumericalIntegrationRule defaultRule, int defaultSubintervalsCount)
: this(defaultRule)
{
DefaultSubintervalsCount = defaultSubintervalsCount;
}
public double Calculate(NumericalIntegrationRule rule, Func<double, double> func, double min, double max, double subintervalsCount)
{
return rule.Calculate(func, min, max, subintervalsCount);
}
public double Calculate(Func<double, double> func, double min, double max)
{
return Calculate(DefaultRule, func, min, max, DefaultSubintervalsCount);
}
}
class TrapezoidalRule : NumericalIntegrationRule
{
public double Calculate(Func<double,double> func, double min, double max, double subintervalsCount)
{
double result = 0;
double step = (max - min) / subintervalsCount;
for (double i = min; i < max; i += step)
result += ((func(i) + func(i + step)) / 2) * step;
return result;
}
}
public static Complex GetSpectralDensity(double U, double anguarFrequency, double T)
{
NumericalIntegration integration = new NumericalIntegration();
if (anguarFrequency == 0)// Учитываем деление на 0
return new Complex(U * T, 0);
return U * integration.Calculate(t => Math.Cos(anguarFrequency * t), 0, T) - Complex.ImaginaryOne * U * integration.Calculate(t => Math.Sin(anguarFrequency * t), 0, T);
}
{
double Calculate(Func<double, double> func, double min, double max, double subintervalsCount);
}
class NumericalIntegration
{
public readonly NumericalIntegrationRule DefaultRule = null;
public readonly int DefaultSubintervalsCount = 100;//100000
public NumericalIntegration()
{
DefaultRule = new TrapezoidalRule();
}
public NumericalIntegration(NumericalIntegrationRule defaultRule)
{
DefaultRule = defaultRule;
}
public NumericalIntegration(NumericalIntegrationRule defaultRule, int defaultSubintervalsCount)
: this(defaultRule)
{
DefaultSubintervalsCount = defaultSubintervalsCount;
}
public double Calculate(NumericalIntegrationRule rule, Func<double, double> func, double min, double max, double subintervalsCount)
{
return rule.Calculate(func, min, max, subintervalsCount);
}
public double Calculate(Func<double, double> func, double min, double max)
{
return Calculate(DefaultRule, func, min, max, DefaultSubintervalsCount);
}
}
class TrapezoidalRule : NumericalIntegrationRule
{
public double Calculate(Func<double,double> func, double min, double max, double subintervalsCount)
{
double result = 0;
double step = (max - min) / subintervalsCount;
for (double i = min; i < max; i += step)
result += ((func(i) + func(i + step)) / 2) * step;
return result;
}
}
public static Complex GetSpectralDensity(double U, double anguarFrequency, double T)
{
NumericalIntegration integration = new NumericalIntegration();
if (anguarFrequency == 0)// Учитываем деление на 0
return new Complex(U * T, 0);
return U * integration.Calculate(t => Math.Cos(anguarFrequency * t), 0, T) - Complex.ImaginaryOne * U * integration.Calculate(t => Math.Sin(anguarFrequency * t), 0, T);
}
Беру действительную часть комплексного числа
Код:
public void drawreverse(double U, double anguarFrequency, double T, double shag,int frc,int frc1)
{
GraphPane panel77 = zedGraphControl2.GraphPane;
panel77.Title.Text = "Обратное преобразование";
panel77.XAxis.MajorGrid.IsVisible = true;
panel77.YAxis.MajorGrid.IsVisible = true;
panel77.YAxis.MajorGrid.IsZeroLine = false;
panel77.XAxis.Title.Text = "f,кГЦ";
panel77.YAxis.Title.Text = "U(f), мВ*с";
PointPairList list = new PointPairList();
double xmin = -100;
double xmax = 100;
for (double fr = xmin; fr <= xmax; fr += shag)
{
double angularFrequency = 2 * Math.PI * fr;
Complex x1 = reverstrans(U, anguarFrequency, T, frc, frc1);
Complex x2 = reverstrans(U, anguarFrequency, T, frc, frc1);
list.Add(angularFrequency,x1.Real);//Заношу точку в список.
}
panel77.AddCurve("", list, Color.Blue, SymbolType.None);
}
{
GraphPane panel77 = zedGraphControl2.GraphPane;
panel77.Title.Text = "Обратное преобразование";
panel77.XAxis.MajorGrid.IsVisible = true;
panel77.YAxis.MajorGrid.IsVisible = true;
panel77.YAxis.MajorGrid.IsZeroLine = false;
panel77.XAxis.Title.Text = "f,кГЦ";
panel77.YAxis.Title.Text = "U(f), мВ*с";
PointPairList list = new PointPairList();
double xmin = -100;
double xmax = 100;
for (double fr = xmin; fr <= xmax; fr += shag)
{
double angularFrequency = 2 * Math.PI * fr;
Complex x1 = reverstrans(U, anguarFrequency, T, frc, frc1);
Complex x2 = reverstrans(U, anguarFrequency, T, frc, frc1);
list.Add(angularFrequency,x1.Real);//Заношу точку в список.
}
panel77.AddCurve("", list, Color.Blue, SymbolType.None);
}
В итоге пустое графическое окно ZedGraph введите сюда описание изображения
ЧТО БЫЛО МНОЙ СДЕЛАНО
На форумах где цифровая обработка сигналов сказали,что нужно взять мнимую и действительную часть от GetSpectralDensity(U, anguarFrequency, T) и подставить в обратное преобразование Фурье(Формула выше).
Я так и сделал Про пределы интегрирования -314 до 314,это так нужно..
Мнимая часть ушла в 0,а действительная осталась.
Я взял действительную часть и подставил в график,но увы ничего не вывело.
Вполне полагаю что проблема с формулой,точнее с синтаксисом формулы. Я изменял данные ввода и переставлял переменные и функции но график такой же пустой. Даже если бы расчёт был бы неправильный он должен был вывести хотя бы какую-то кривую,а так он совсем ничего не выводит. Хотелось бы разобраться и найти свою упущенную деталь при построении графика.
А синтаксис формулы правильный?
Я думаю проблема в синтаксисе формулы
Попробуй прежде в маткаде вычислить и построить. У него есть автомасштабирование, так что график ты увидишь.
У вас в таблице показаны значения реальной части до 1, а на графике масштаб 10-ки. По-моему график просто "не видно". Измените масштаб.
Код:
Dictionary<double, double> coordinats = new Dictionary<double, double>();
for (double fr = xmin; fr <= xmax; fr += 0.1)
{
coordinats.Add(fr, fr *fr);
}
GraphPane Pane77 = new GraphPane();
zedGraphControl2.GraphPane = Pane77;
Pane77.XAxis.Title.Text = "f,кГЦ";
Pane77.YAxis.Title.Text = "U(f), мВ*с";
Pane77.Title.Text = "Обратное преобразование";
Pane77.Fill = new Fill(Color.White, Color.LightSkyBlue, 45.0f);
Pane77.Chart.Fill.Type = FillType.None;
Pane77.Legend.Position = LegendPos.Float;
Pane77.Legend.IsHStack = false;
LineItem myCurve = Pane77.AddCurve("",coordinats.Keys.ToArray(), coordinats.Values.ToArray(), Color.Blue,SymbolType.None);
myCurve.Symbol.Fill = new Fill(Color.White);
zedGraphControl2.AxisChange();
zedGraphControl2.Refresh();
zedGraphControl2.Visible = true;
for (double fr = xmin; fr <= xmax; fr += 0.1)
{
coordinats.Add(fr, fr *fr);
}
GraphPane Pane77 = new GraphPane();
zedGraphControl2.GraphPane = Pane77;
Pane77.XAxis.Title.Text = "f,кГЦ";
Pane77.YAxis.Title.Text = "U(f), мВ*с";
Pane77.Title.Text = "Обратное преобразование";
Pane77.Fill = new Fill(Color.White, Color.LightSkyBlue, 45.0f);
Pane77.Chart.Fill.Type = FillType.None;
Pane77.Legend.Position = LegendPos.Float;
Pane77.Legend.IsHStack = false;
LineItem myCurve = Pane77.AddCurve("",coordinats.Keys.ToArray(), coordinats.Values.ToArray(), Color.Blue,SymbolType.None);
myCurve.Symbol.Fill = new Fill(Color.White);
zedGraphControl2.AxisChange();
zedGraphControl2.Refresh();
zedGraphControl2.Visible = true;