Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11711
Последний выпуск: 19.06.2015

Проблема с синтаксисом формулы

86K
06 июня 2016 года
beginer_progr
7 / / 02.06.2016
Вот формула



Запрограммировал

 
Код:
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);      
           }

Метод 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);
        }
Пошли вычисления - Мнимая часть ушла в 0,как и требовалось по теории



Беру действительную часть комплексного числа

Код:
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);
        }


В итоге пустое графическое окно ZedGraph введите сюда описание изображения

ЧТО БЫЛО МНОЙ СДЕЛАНО

На форумах где цифровая обработка сигналов сказали,что нужно взять мнимую и действительную часть от GetSpectralDensity(U, anguarFrequency, T) и подставить в обратное преобразование Фурье(Формула выше).

Я так и сделал Про пределы интегрирования -314 до 314,это так нужно..

Мнимая часть ушла в 0,а действительная осталась.

Я взял действительную часть и подставил в график,но увы ничего не вывело.

Вполне полагаю что проблема с формулой,точнее с синтаксисом формулы. Я изменял данные ввода и переставлял переменные и функции но график такой же пустой. Даже если бы расчёт был бы неправильный он должен был вывести хотя бы какую-то кривую,а так он совсем ничего не выводит. Хотелось бы разобраться и найти свою упущенную деталь при построении графика.
86K
07 июня 2016 года
beginer_progr
7 / / 02.06.2016
Да показывает график
А синтаксис формулы правильный?

Я думаю проблема в синтаксисе формулы
6
11 июня 2016 года
@pixo $oft
3.4K / / 20.09.2006
Попробуй прежде в маткаде вычислить и построить. У него есть автомасштабирование, так что график ты увидишь.
403
06 июня 2016 года
grgdvo
321 / / 04.07.2007
У вас в таблице показаны значения реальной части до 1, а на графике масштаб 10-ки. По-моему график просто "не видно". Измените масштаб.
320
07 июня 2016 года
UserNet2008
686 / / 03.04.2010
А если так забубенить от столба, будет график or нет
Код:
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;

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог