2013-11-01 4 views
0

Вот мой код MATLAB, который вычисляет дифракцию френеля. И я хочу реализовать тот же код на C++.Сложное присвоение номера

clc;clear all;close all; 

N=512; 
M=512; 
lambda=632e-9; 
X = 12.1e-6; 
k=2*pi/lambda; 
z0 = (N*X^2)/lambda; 
a = (exp(j*k*z0)/(j*lambda)) 
hX=(exp(j*k*z0)/(j*lambda))*exp(j*pi/(z0*lambda)*X^2*[0:N-1].^2); 
hY=(exp(j*k*z0)/(j*lambda))*exp(j*pi/(z0*lambda)*X^2*[0:M-1].^2); 
h = hX.'*hY; 
figure; imshow(real(h), []); 

И в то время как им пытается реализовать один и тот же код на C++ я попытался это:

int main(){ 
std::complex<double> com_two(0,1); 
double mycomplex = 1; 
double pi = 3.1415926535897; 
double N = 512; 
double M = 512; 
double lambda = 632e-9; 
double X = 12.1e-6; 
double k = (2*pi)/lambda; 
double z0=(N*pow(X,2))/lambda; 
//std::complex<double> hx; // Both definitions don't work 
//double hy; 
/*for (int j=0; j < N; j++){ 
    hy = (exp(mycomplex*k*z0)/(mycomplex*lambda))*exp(mycomplex*pi/(z0*lambda)*pow(X,2)*pow(j,2)); 
    cout << hy <<endl; 
}*/ 
system("pause"); 
return 0; 

}

Но дело в том, что при расчете выполнения HX и хе значения возвращают комплексные значения.

Так как я должен определить «mycomplex» как i, j, как в коде MATLAB. Также я нашел несколько осей, таких как std::complex<double> complex;

Но я думаю, что это не сработает. По-моему, мне нужно получить значения hx и hy как сложные числа. Но я не смог найти правильное решение.

Я буду очень рад, если кто-то поможет в этом.

+0

так в чем проблема? hy сложна или нет? – 4pie0

+0

Да, он должен принимать комплексные числа, такие как 5 + 3i и т. Д. Правая часть уравнения дает комплексные числа, но когда я пытаюсь отобразить результат, он дает мне 1 INF, который я не хочу получать. – Mertcan

+1

где ваше заявление? plese paste – 4pie0

ответ

1

проблема не является сложным числом, а вычислениями, которые вы выполняете. Сначала вы делаете разные вещи в Matlab alg (версия, которую вы показали как минимум) и на C++. Вот как вы должны переносить этот код на C++.

#include <cstdlib> 
#include <iostream> 
#include <complex> 
using namespace std; 
/* 
* 
*/ 
int main(int argc, char** argv) { 
    double pi = 3.1415926535897; 
    double N = 512; 
    double M = 512; 
    double lambda = 632e-9; 
    double X = 12.1e-6; 
    double k = (2 * pi)/lambda; 
    double z0 = (N * pow(X, 2))/lambda; 
    std::complex<double> hx, hy; // Both definitions don't work 
    //double hy; 
    int j = 1; 
    //for (int j=0; j < N; j++){ 
     hy = (exp(j*k*z0)/(j*lambda))*exp(j*pi/(z0*lambda)*pow(X,2)*pow(j,2)); 
     cout << hy <<endl; 
    //} 
    system("pause"); 
    return 0; 
} 

теперь проблема в вашем lambda = 632e-9, которая близка к нулю, то к очень большой k = (2 * pi)/lambda; как инверсия нечто такое, что приближается к 0, и в свою очередь

exp(j*k*z0) 

очень большой, и это

(exp(j*k*z0)/(j*lambda)) 

еще больше. Тогда это

(exp(j*k*z0)/(j*lambda))*exp(j*pi/(z0*lambda) 

огромное, а остающийся фактор pow(X,2)*pow(j,2)) имеет смысл. Итак

cout << hy <<endl; 

напечатает (inf,0) даже для лямбда = 0,0001; (как насчет 632e-9!).

Однако вы можете распечатать его, если вы используете достаточно небольшую j значения, чтобы поглотить огромное k значения в ехре (j также в знаменателе, но de l'Hopital rule обеспечит это будет меньше).

Как следует из ваших комментариев (а не вашего кода), вы хотели бы, чтобы j было комплексным числом z = 1i. Тогда решение изменить

double j =1; 

в

std::complex<double> j(0,1); 

РЕШЕНИЕ:

int main(int argc, char** argv) { 
    double pi = 3.1415926535897; 
    double N = 512; 
    double M = 512; 
    double lambda = 0.00001;//632e-9; 
    double X = 12.1e-6; 
    double k = (2 * pi)/lambda; 
    double z0 = (N * pow(X, 2))/lambda; 
    std::complex<double> hx, hy; 
    std::complex<double> j(0,1); 
     hy = (exp(j*k*z0)/(j*lambda))*exp(j*pi/(z0*lambda)*pow(X,2)*pow(j,2)); 
     cout << hy <<endl; 
    return 0; 
} 
+0

'j' является мнимым 1 в matlab. Здесь - это реальное положительное число. Это основная ошибка. – Sergey

+0

Я использовал int j, поскольку это то, что вы показали в своем коде, без проблем использовать сложный (0,1) вместо – 4pie0

0

Я изменил несколько строк в коде, и это дает результаты, отличающиеся от 1 # INF

1) Изменять mycomplex от double до std::complex<double> и назначить (0,1), чтобы сделать его мнимая 1. На самом деле com_two имеет тот же тип и значение, необходимое для mycomplex, и вы не используете его.

2) Удалить комментарии. Изменить hy тип от double до std::complex<double>. Удалите неиспользуемую декларацию hx.

3) Мой компилятор обнаружил ошибку в pow(j,2) из-за двусмысленности, поэтому я ее исправил.

#include <iostream> 
#include <complex> 

using namespace std; 

int main(){ 
    complex<double> mycomplex(0,1); 
    double pi = 3.1415926535897; 
    double N = 512; 
    double M = 512; 
    double lambda = 632e-9; 
    double X = 12.1e-6; 
    double k = (2*pi)/lambda; 
    double z0=(N*pow(X,2))/lambda; 
    complex<double> hy; 
    for (int j=0; j < N; j++){ 
     hy = (exp(mycomplex*k*z0)/(mycomplex*lambda))*exp(mycomplex*pi/(z0*lambda)*pow(X,2)*pow((double)j,2)); 
     cout << hy <<endl; 
    } 
    system("pause"); 
    return 0; 
} 
+0

вы изменили код. OP использует double mycomplex = 1; и он полностью отличается от вашего комплекса mycomplex (0,1); который является мнимым «1i» – 4pie0

+0

Да, я упомянул об этом в '1)'. Это фактически то, что OP хочет сделать код похожим на matlab, где 'j' является мнимым 1. – Sergey

+0

это не MATLAB, который использует j, но OP, он объявил это как мнимое j, как мы теперь знаем, но не упомянул об этом, однако показал нам int, omg – 4pie0

Смежные вопросы