2012-06-25 12 views
1

Привет Я пытаюсь преобразовать следующий код из спектральных методов Trefethen в MATLAB на Python.Преобразование кода Matlab в Python

% p6.m - variable coefficient wave equation 

% Grid, variable coefficient, and initial data: 
    N = 128; h = 2*pi/N; x = h*(1:N); t = 0; dt = h/4; 
    c = .2 + sin(x-1).^2; 
    v = exp(-100*(x-1).^2); vold = exp(-100*(x-.2*dt-1).^2); 

% Time-stepping by leap frog formula: 
    tmax = 8; tplot = .15; clf, drawnow, set(gcf,'renderer','zbuffer') 
    plotgap = round(tplot/dt); dt = tplot/plotgap; 
    nplots = round(tmax/tplot); 
    data = [v; zeros(nplots,N)]; tdata = t; 
    for i = 1:nplots 
    for n = 1:plotgap 
     t = t+dt; 
     v_hat = fft(v); 
     w_hat = 1i*[0:N/2-1 0 -N/2+1:-1] .* v_hat; 
     w = real(ifft(w_hat)); 
     vnew = vold - 2*dt*c.*w; vold = v; v = vnew; 
    end 
    data(i+1,:) = v; tdata = [tdata; t]; 
    end 
    waterfall(x,tdata,data), view(10,70), colormap(1e-6*[1 1 1]); 
    axis([0 2*pi 0 tmax 0 5]), ylabel t, zlabel u, grid off 

По большей части она идет гладко для этой строки кода

data = [v; zeros(nplots,N)] 

кроме После прочтения, как конвертировать между Numpy и Matlab здесь http://www.scipy.org/NumPy_for_Matlab_Users#head-e9a492daa18afcd86e84e07cd2824a9b1b651935 я попытался преобразовать его, выполнив следующие действия

data = np.array(v,zeros(nplots,N)) 

, но я получаю эту ошибку

data = np.array(v,zeros(nplots,N)); 
TypeError: data type not understood 

Что я принимаю, потому что NumPy arrry имеет такую ​​структуру

numpy.array(object,dtype=none) 

Я был бы признателен за любую помощь при преобразовании этой строки. Заранее спасибо!

+0

возможно 'np.vstack ((v, нули (nplots, N)))' – JBernardo

+0

@JBernardo спасибо за ответ. Я попробовал vstack, но я до сих пор получаю ошибку типа TypeError: тип данных непонят. – Surfcast23

+0

Проверьте количество парнеров ... Должно быть больше * обычного * :) – JBernardo

ответ

2

data = [v; zeros(nplots,N)] это объединение двух матриц и stacken их, обратите внимание на NumPy в ; вы можете использовать numpy.concatenate((v, zeros((nplots,N))), axis = 0), где ось по какой оси вы хотите, чтобы сцепить по ...

data = np.array(v,zeros(nplots,N)); 
TypeError: data type not understood 

в основном, когда вы звоните np.array аргумент кулака должен быть итерируемым объектом, списком, кортежем и на вторым аргументом должен быть тип ie 'int', 'float32', 'float32' и т. д. ... но вы устанавливаете тип zeros(nplots,N)numpy жалуется что это не тип ... numpy.zeros это же первый аргумент должен быть кортежем, а второй тип, жаль, что я не правильно включать ()

следует data = numpy.concatenate((v, numpy.zeros((nplots,N))), axis = 0) при условии, что вы хотите использовать double тип, который является стандартным типом.

+0

Спасибо для ответа. Я попытался конкатенировать, но я все еще получаю сообщение об ошибке – Surfcast23

+0

@ Surfcast23 жаль, что перередактировал сообщение. –

+0

, что это благодаря! – Surfcast23

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