Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2016, 22:21   #1
schoolboy99
Пользователь
 
Регистрация: 11.02.2015
Сообщений: 57
По умолчанию Избавиться от неявного преобразования

Есть метод

Код:
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 reverstrans(double U, double anguarFrequency, double T)
       {
            
           NumericalIntegration integration = new NumericalIntegration();
           double u1 = U * integration.Calculate(t => Math.Cos(anguarFrequency), 0, T);//U'(w)
           double u2 = U * integration.Calculate(t => Math.Sin(anguarFrequency), 0, T);//U''(w)
           double ValFurieTrans = u1 - Complex.ImaginaryOne * u2;//U'(w) - U''(w) = U(w)e^-j*fi(w) Ошибка Неявное преобразование
           return (1 / (2 * Math.PI)) * integration.Calculate(w => Math.Cos(ValFurieTrans), 0, T) + Complex.ImaginaryOne * (1 / (2 * Math.PI)) * integration.Calculate(w => Math.Sin(ValFurieTrans), 0, T);
        }
И неявное преобразование мешает мне дальше работать с программой
как его можно обойти?
менять типы возвращаемого значения не стоит,так как логика программы рушится.
Изображения
Тип файла: jpg Безымянный-777.jpg (25.7 Кб, 120 просмотров)
schoolboy99 вне форума Ответить с цитированием
Старый 03.06.2016, 09:16   #2
schoolboy99
Пользователь
 
Регистрация: 11.02.2015
Сообщений: 57
По умолчанию

Код:
public static Complex reverstrans(double U, double anguarFrequency, double T)
           {              
 NumericalIntegration integration = new NumericalIntegration();
double u1 = U * integration.Calculate(t => Math.Cos(anguarFrequency), 0, T);//U'(w)
 double u2 = U * integration.Calculate(t => Math.Sin(anguarFrequency), 0, T);//U''(w)
System.Numerics.Complex uu1 = u1; // преобразование u1 в комплексное число uu1(u1,0)
           System.Numerics.Complex uu2 = u2; // преобразование u2 в комплексное число uu2(u2,0)
           Complex img = Complex.ImaginaryOne;
Complex ValFurieTrans = uu1 - img * uu2; //Вычисляем U(w)e^-j*fi(w)= U'(w) - U''(w)
      return (1 / (2 * Math.PI)) * integration.Calculate(w => Math.Cos(ValFurieTrans), 0, T) + Complex.ImaginaryOne * (1 / (2 * Math.PI)) * integration.Calculate(w => Math.Sin(ValFurieTrans), 0, T);
            }

в этот раз ругается на неявное преобразование где return

Пробовал несколько вариантов
-Если я напишу
Код:
Math.Cos(ValFurieTrans)
сделать
Код:
Complex.Cos(ValFurieTrans)
то мой метод Calculate придётся переделывать из Func<double,double> в <Complex,Complex> что существенно усложнит проблему и вылезит куча других ужасных ошибок.

-Если я напишу
Код:
Math.Cos(Convert.ToDouble(ValFurieTrans))
то тут во время работы программы возникнет исключение
CollapsedWrap disabledLine numbers off
Код:
Необработанное исключение типа "System.InvalidCastException" в mscorlib.dll
 
Дополнительные сведения: Не удалось привести тип объекта "System.Numerics.Complex" к типу "System.IConvertible"
schoolboy99 вне форума Ответить с цитированием
Старый 03.06.2016, 09:28   #3
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

А полный код слишком длинный?
Скиньте весь код - я хотел бы поэкспериментировать с ним, а то я не настолько профессионален чтобы по кусочку кода найти ошибку.
ura_111 вне форума Ответить с цитированием
Старый 03.06.2016, 13:59   #4
schoolboy99
Пользователь
 
Регистрация: 11.02.2015
Сообщений: 57
По умолчанию

Я скинул его в блокноте

Код большой
Смысл задачи что по формуле построить график
Пока проблема с кодом,как решится проблема с кодом то я буду разбиратся с графиком.
Код:
public FurierTransformReverse()
        {
            InitializeComponent();
            zedGraphControl1.ZoomEvent += new ZedGraphControl.ZoomEventHandler(zoom_event);
            zedGraphControl2.ZoomEvent += new ZedGraphControl.ZoomEventHandler(zoom_event);
            zedGraphControl1.PointValueEvent += new ZedGraphControl.PointValueHandler(zedGraph_PointValueEvent);
        }

        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);
        }

        public static double GetSpectralDensityOfAmplitude(Complex spectralDensity)
        {
            return Complex.Abs(spectralDensity);
        }

      
        public static double reverstrans(double U, double anguarFrequency, double T)
       {          
           NumericalIntegration integration = new NumericalIntegration();
           double u1 = U * integration.Calculate(t => Math.Cos(anguarFrequency), 0, T);//U'(w)
           double u2 = U * integration.Calculate(t => Math.Sin(anguarFrequency), 0, T);//U''(w)
           Complex uu1 = u1; // преобразование u1 в комплексное число uu1(u1,0)
           Complex uu2 = u2; // преобразование u2 в комплексное число uu2(u2,0)
           Complex img = Complex.ImaginaryOne;// инициализируем новый экземпляр объекта complex samvalue(1,0)
           Complex ValFurieTrans = uu1 - img * uu2; //Вычисляем U(w)e^-j*fi(w)= U'(w) - U''(w) 
           double VFT = ValFurieTrans;
           return (1 / (2 * Math.PI)) * integration.Calculate(w => Math.Cos(ValFurieTrans), 0, T) + Complex.ImaginaryOne * (1 / (2 * Math.PI)) * integration.Calculate(w => Math.Sin(ValFurieTrans), 0, T);              
        }
Вложения
Тип файла: txt erer.txt (3.8 Кб, 117 просмотров)

Последний раз редактировалось Alex11223; 03.06.2016 в 14:42. Причина: "блокнот" бессмысленен
schoolboy99 вне форума Ответить с цитированием
Старый 03.06.2016, 15:38   #5
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

В общем ничего я не понял из кода. Я привык разбираться в чужом коде то что называется "в живую", когда можно поэкспериментировать, когда можно поставить точку останова или определить пользовательские типы переменных просто наведя на них. Из Вашего же участка кода ничего не понятно.

Но я заметил, что Вы используете ф-цию integration.Calculate для определения double u1, double u2, - может вместо Complex ValFurieTrans их подставите (u1-u2). Или Complex - это структура? Подставить (ValFurieTrans.x) - вещественную часть комплексного числа.

Ещё не понятно что такое Math.
ura_111 вне форума Ответить с цитированием
Старый 03.06.2016, 15:53   #6
schoolboy99
Пользователь
 
Регистрация: 11.02.2015
Сообщений: 57
По умолчанию

Вживую тоже можно,я вас не так понял наверное

Выбираете модуль FurierTransformReverse
Вложения
Тип файла: zip MainFormProg-Вывод комплексных чисел.zip (990.9 Кб, 5 просмотров)
schoolboy99 вне форума Ответить с цитированием
Старый 03.06.2016, 21:55   #7
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Нифига я не нашёл. Я так понял здесь нужен хороший математик, а не программист - потому что мой уровень высшей математики не решает вопросы, а наоборот, их ставит:
1) У тебя жестко задан прямоугольный импульс? Ты в прямом уравнении u(t) выносишь за интеграл по u(t), как будто оно сonst.
2) Как ты посчитал U'(w)-jU''(w)? Меня ещё в школе учили, что вещественная часть это дно, а мнимая другое. И просто сложить их нельзя.
3) Тот же вопрос и в return.
4) Почему ты не рассчитываешь return по формуле 4.12?
5) Сопоставив формулу 4.12 и вышестоящую - я выявил как смена интервала повлияло на коэффициент при интеграле: (-бескон. + бескон) поменяли на (0 +бескон) - умножив интеграл на 2.
Так вот, ты при определении U'(w) и U''(w) меняешь интервал на (0 +Т), но ни какаю 2-ку не умножаешь.

Или я что-то недопонимаю?
ura_111 вне форума Ответить с цитированием
Старый 03.06.2016, 22:19   #8
schoolboy99
Пользователь
 
Регистрация: 11.02.2015
Сообщений: 57
По умолчанию

Спасибо за описание моих ошибок в программе
Как раз нужен был взгляд со стороны программиста.

Отвечу на ваши вопросы
1)Да это условие задачи - прямоугольный импульс
2)Вот здесь вы мне подсказали,и я под конец понял что так делать нельзя
3)где return это Формула Эйлера уже
4)Мне сказали что это мой ответ по формуле 4.12,и якобы он должен получится в моём методе reverstrans

Вы всё правильно понимаете.
У меня появилась работа на ночь.
Спасибо вам!)

Последний раз редактировалось schoolboy99; 03.06.2016 в 22:21.
schoolboy99 вне форума Ответить с цитированием
Старый 03.06.2016, 23:04   #9
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

" где return это Формула Эйлера уже"
А что такое здесь фи? Сдвиг каждой гармоники. Он всегда будет 0-ль или нет? Потому что я не заметил чтобы менялся.
ura_111 вне форума Ответить с цитированием
Старый 03.06.2016, 23:27   #10
schoolboy99
Пользователь
 
Регистрация: 11.02.2015
Сообщений: 57
По умолчанию

Да с фи проблема я думаю что делать с ней(посоветуюсь с математиками)
Но я исправлю,но будет уже другой вопрос завтра.
schoolboy99 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Избавиться от chdir flyingbudda БД в Delphi 13 22.04.2014 11:30
Избавиться от BlueScreen Анастасия2013 Windows 5 30.01.2013 09:59
Как избавиться от #Н/Д? kachorro Microsoft Office Excel 10 26.04.2012 06:38
Избавиться от нагромождения IF fezilk25 Общие вопросы Delphi 9 17.11.2010 20:30
Можно ли в этом С++-коде избавиться от C-шного преобразования типов? Oleg_SK Общие вопросы C/C++ 8 07.06.2010 15:32