2

I am trying to convert a calculation in matlab to python. This is code in matlab:

% Solving for the bandpass correction

T = 8050; % temperature in kelvin
c = 2.99e10; % speed of light in cm/s
h = 6.626e-27; % planck constant in ergs
k = 1.38e-16; % boltzmann constant in erg/K
x1 = 3e-4; % lower wavelength in cm
x2 = 13e-4; % upper wavelength in cm

fun = @(x) ((2 * h * c^2) ./ x.^5) ./ (exp((h * c) ./ (x * k * T)) - 1); % planck function
f_deriv = @(x) ((2 * h^2 * c^3) ./ (x.^6 * k)) .* (exp((h .* c) ./ (x* k * T)) ./ (T * (exp((h * c) ./ (x * k * T)) - 1).^2));
numerator = integral(f_deriv,x1,x2);
denominator = (4 * integral(fun,x1,x2));
beta = numerator / denominator;
fprintf('The numerator is %f \n',numerator)
fprintf('The denominator is %f \n',denominator)
fprintf('The bandpass value is %f \n',beta)

Here is my attempt to code it in python:

# Solving for the bandpass correction:

from scipy.integrate import quad
import numpy as np

T = 8050  # temperature in kelvin
c = 2.99e10  # speed of light in cm/s
h = 6.626e-27  # planck constant in ergs
k = 1.38e-16  # boltzmann constant in erg/K
x1 = 3e-4  # lower wavelength in cm
x2 = 13e-4  # upper wavelength in cm


def p_function(x):
    return ((2 * h * c ** 2) / x ** 5) / (np.exp((h * c)/(x * k * T)) - 1)  # The Planck function


def p_deriv(x):
    return ((2 * h ** 2 * c ** 3) / (x ** 6 * k)) * (np.exp((h * c)/(x * k * T))/(T * (np.exp((h * c) / (x * k * T)) - 1) ** 2))


numerator = quad(p_deriv, x1, x2)
denominator = 4 * quad(p_function, x1, x2)
beta = numerator[0] / denominator[0]
print("The numerator is", numerator[0])
print("The denominator is", denominator[0])
print("The bandpass value is", beta)

The beta value is not consistent between the two and I cannot see what is causing the difference. I would appreciate any help in reconciling this. Thanks!

7
  • I don't know matlab, but could those dots . before some of the operators (like the ./, the .*, and the .^) have anything to do with it? What do those dots mean? Commented Mar 7, 2022 at 23:59
  • This should not be the cause of your problem but... Your denominator should probably be set to 4 * quad(p_function, x1, x2)[0]. Because multiplying a tuple by 4 results in a tuple of length 4 (in python 3 at least). Commented Mar 8, 2022 at 0:04
  • @SylvesterKruin those are element-wise operations if I remember correctly. Commented Mar 8, 2022 at 0:05
  • What values do you get? Commented Mar 8, 2022 at 0:13
  • @dekuShrub I made the change you suggested and it worked. The values are consistent now. Thank you for your help! Commented Mar 8, 2022 at 0:16

1 Answer 1

2

Often when translating MATLAB it's important to get shapes/sizes correct. But when I run your code in Octave I see all variables are (1,1), "scalar". So dimensions shouldn't be an issue.

Let's check function values:

>> fun(1)
ans =  0.066426
>> f_deriv(1)
ans =  0.066432

Your numpy values look the same:

In [3]: p_function(1)
Out[3]: 0.06642589646577152
In [4]: p_deriv(1)
Out[4]: 0.06643181982384715

And integration results:

>> numerator
numerator =  795765635.47589

In [7]: numerator = quad(p_deriv, x1, x2)
In [8]: numerator
Out[8]: (795765635.4758892, 0.030880182071769013)

READING THE DOCS we see that quad returns (as a default) 2 values, the integral and an error estimate. The first of the tuple matches the MATLAB. You do use numerator[0].

Same for the denominator - taking care to extract the value from the tuple before multiplication:

In [10]: denominator = 4 * quad(p_function, x1, x2)[0]
In [11]: denominator
Out[11]: 2568704689.659281
In [12]: numerator[0] / denominator
Out[12]: 0.309792573151506

>> beta
beta =  0.30979

Without the correction, the result is 4x too large

In [13]: denominator = 4 * quad(p_function, x1, x2)
In [14]: denominator
Out[14]: 
(642176172.4148202,
 0.006319781838840299,
 642176172.4148202,
 0.006319781838840299,
 642176172.4148202,
 0.006319781838840299,
 642176172.4148202,
 0.006319781838840299)
In [15]: numerator[0] / denominator[0]
Out[15]: 1.239170292606024

Sometimes (or even often) we need to test values step by step. Even when developing numpy code from scratch, I test all steps.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.