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

Ваш аккаунт

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

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

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

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

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

Избавиться от неявного преобразования

86K
02 июня 2016 года
beginer_progr
7 / / 02.06.2016
Нужно запрограммировать формулу обратного преобразования Фурье.
Я полез в математическую теорию и на основе этой теории



Получился метод reverstrans(тоже использую формулу Эйлера)
Как я понял что U'(w) и U''(w) нужно найти и потом вычислить по формуле для дальнейшей подстановки в формулу обратного преобразования Фурье
Собственно это я и реализовал в методе.
Код:
class NumericalIntegration
        {
//здесь методы,поля всё работает
        }

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);
        }
Проблема в том что в методе public static Complex reverstrans в строке double ValFurieTrans = u1 - Complex.ImaginaryOne * u2;//U'(w) - U''(w) = U(w)e^-j*fi(w) ругается на "=Неявное преобразование типа "System.Numerics.Complex" в "double" невозможно=" и тем самым тормозит дальнейшую разработку программного модуля.

Изменить на возвращаемый тип double не решает мою проблему,а лишь только усугубляет её.
1.9K
06 июня 2016 года
Kuzya
183 / / 19.03.2008
Цитата: beginer_progr
Цитата: Kuzya
почитайте на MSDN про комплексные числа в c# и их преобразованиях, математика с комплексными числами, там и примеры есть.

Спасибо я читаю MSDN но там из double в Complex,а у меня же всё наоборот я должен из Complex в double

Тоже это заметил, но комплексное число — это выражение вида a + bi, где a, b — действительные числа, а i — так называемая мнимая единица, и как вы себе представляете преобразование "a + bi" в обычное вещественное число? потому вам нужно решить, что из комплексного числа вам надо a или bi, вот собственно это число и преобразуется в double.

1.9K
03 июня 2016 года
Kuzya
183 / / 19.03.2008
посмотрел доки, примерно, должно хотя бы быть так:




System.Numerics.Complex uu1 = u1; // преобразуем дубл u1 в комплексное uu1(u1,0)
System.Numerics.Complex uu2 = u2; // преобразуем дубл u2 в комплексное uu2(u2,0)
complex samevalue = Complex.ImaginaryOne; // инициализируем новый экземпляр объекта complex samvalue(1,0)
Complex ValFurieTrans = uu1 - samevalue * uu2; //делаем U'(w) - U''(w)

но ValFurieTrans уже будет не double, а комплексным числом.
86K
03 июня 2016 года
beginer_progr
7 / / 02.06.2016
Цитата: Kuzya
посмотрел доки, примерно, должно хотя бы быть так:




System.Numerics.Complex uu1 = u1; // преобразуем дубл u1 в комплексное uu1(u1,0)
System.Numerics.Complex uu2 = u2; // преобразуем дубл u2 в комплексное uu2(u2,0)
complex samevalue = Complex.ImaginaryOne; // инициализируем новый экземпляр объекта complex samvalue(1,0)
Complex ValFurieTrans = uu1 - samevalue * uu2; //делаем U'(w) - U''(w)

но ValFurieTrans уже будет не double, а комплексным числом.

Да да вы правы,теперь проблема перешла из тех строк в return ,где у меня собственно и происходит вычисление формулы.
Как можно обойти это неявное преобразование?

Я изменял Complex.Sin,Complex.Cos но тут уже более другая проблема, метод подсчётов интегралов Calculate работает с double и весь класс подсчёта интегралов объявлен double.
И компилятор выдаёт такую ошибку

Не удается преобразовать "лямбда-выражение" в делегат "System.Func<double,double>", поскольку некоторые из типов результатов, возвращаемых блоком, не могут быть неявно преобразованы в тип результата, возвращаемого делегатом

Или мне нужно весь свой класс и интерфейс переделывать из double в Complex?

 
Код:
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);
86K
03 июня 2016 года
beginer_progr
7 / / 02.06.2016
Код:

Код:
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))
то тут во время работы программы возникнет исключение

Код:

 
Код:
Необработанное исключение типа "System.InvalidCastException" в mscorlib.dll
 
Дополнительные сведения: Не удалось привести тип объекта "System.Numerics.Complex" к типу "System.IConvertible"
1.9K
03 июня 2016 года
Kuzya
183 / / 19.03.2008
почитайте на MSDN про комплексные числа в c# и их преобразованиях, математика с комплексными числами, там и примеры есть.
86K
03 июня 2016 года
beginer_progr
7 / / 02.06.2016
Цитата: Kuzya
почитайте на MSDN про комплексные числа в c# и их преобразованиях, математика с комплексными числами, там и примеры есть.

Спасибо я читаю MSDN но там из double в Complex,а у меня же всё наоборот я должен из Complex в double

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

Ваш ответ

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