error in coding probability weighting function - python

I have a question regarding my code (sorry if it is really easy or stupid, I have never coded before and tried this for a project). I tried running a probability weighting function for certain probability vector. I however get an error and I do not know how to fix it. When i run the argument of the function first seperatly and then call it in the function it works, but why does it not work in the function itself?
Code Below
I hope you can help me.
Thanks a lot!
import numpy as np
p = np.arange(0.01, 1, 0.01) # probalities equaly spread between 0 & 1 in steps of 0.01
alpha_1 = 0.5
alpha = np.zeros((1, 99)) + alpha_1 # vector of same length as p with all entries being 0.5
term_in_exopnential_of_weighting_function = - (- np.log(p))**alpha
w = np.exp(term_in_exopnential_of_weighting_function) # weighted probability function
# probability weighting function
#w(p)=np.exp(-(- np.log(p))**alpha)
# --> error, but why?`

It looks like what you're trying to do is to create a function which is named w. In Python the syntax for a function definition is
def f(a, b, c):
# do something here
result = <something involving a, b, and c>
return result
Then you can call the function as f(1, 2, 3) or whatever for a, b, and c.
In the example you gave, I think maybe what you need is
>>> def w(alpha, p):
... return np.exp(-(- np.log(p))**alpha)
...
Where >>> is the Python interpreter input prompt. Note that the function body must be indented, as enforced by the interpreter. The ... with nothing following it means I just hit the Enter key without typing anything. With that definition of w, I get the following result, given alpha and p as you specified:
>>> w(alpha, p)
array([[0.116955 , 0.13836178, 0.15372645, 0.16627328, 0.17713938,
0.18687366, 0.19578782, 0.20407777, 0.21187567, 0.21927533,
0.2263461 , 0.23314086, 0.23970099, 0.24605961, 0.25224365,
0.25827542, 0.26417363, 0.26995416, 0.27563063, 0.28121487,
0.28671721, 0.29214677, 0.29751164, 0.30281908, 0.30807562,
0.31328717, 0.31845916, 0.32359653, 0.32870387, 0.33378542,
0.33884514, 0.34388676, 0.34891376, 0.35392947, 0.35893704,
0.36393949, 0.36893972, 0.37394054, 0.37894464, 0.38395468,
0.38897324, 0.39400286, 0.39904606, 0.40410531, 0.40918309,
0.41428186, 0.41940411, 0.42455233, 0.42972903, 0.43493677,
0.44017815, 0.44545582, 0.45077251, 0.45613099, 0.46153416,
0.466985 , 0.4724866 , 0.47804216, 0.48365505, 0.48932878,
0.49506703, 0.50087369, 0.50675283, 0.5127088 , 0.51874619,
0.52486989, 0.53108512, 0.53739747, 0.54381293, 0.55033797,
0.55697957, 0.56374529, 0.57064336, 0.57768275, 0.58487331,
0.59222586, 0.59975235, 0.60746605, 0.61538177, 0.62351608,
0.63188769, 0.64051783, 0.64943073, 0.65865431, 0.66822097,
0.67816868, 0.68854243, 0.69939617, 0.71079551, 0.72282159,
0.73557672, 0.74919294, 0.76384569, 0.77977671, 0.79733511,
0.81705854, 0.8398553 , 0.86750307, 0.90461 ]])

Related

Python - Display Function - Prevent new line while using Latex Object

I am trying to output an answer to a differential equation.
My Code:
function = "cos(z)"
def Complex_Function(z):
f1=eval(function)
return f1
f_subsituted = Complex_Function(a+b*exp(x)) # make z = a+b e^x
DerivativeN1_Func = sm.diff(f_subsituted , a) #differntiate f_subsituted once
DerivativeN2_Func = sm.diff(DerivativeN1_Func , a) # differntiate f_subsituted twice
display(Latex(r"$y'''(x)+y(x)=-b^2 e^{-2x}$")) #Output needed (Here is the problem)
display(DerivativeN2_Func)
The correct output should be:
y'''(x)+y(x)=-b^2 e^{-2x} *DerivativeN2_Func
But whatever I try it shows the "DerivativeN2_Func" in a new line.
I tried to:
display(Latex(r"$y'''(x)+y(x)=-b^2 e^{-2x}$"), DerivativeN2_Func)
use (end"") method.
non of them worked.
Can you help me solving this issue please?

variables changing after a function call in python

Ive been working on some code recently for a project in python and im confused by the output im getting from this code
def sigmoid(input_matrix):
rows = input_matrix.shape[0]
columns = input_matrix.shape[1]
for i in range(0,rows):
for j in range(0,columns):
input_matrix[i,j] = (1 / (1 + math.exp(-(input_matrix[i,j]))))
return input_matrix
def feed_forward(W_L_1 , A_L_0 , B_L_1):
weighted_sum = np.add(np.dot(W_L_1,A_L_0), B_L_1)
activation = sigmoid(weighted_sum)
return [weighted_sum,activation]
a = np.zeros((1,1))
b = feed_forward(a,a,a)
print(b[0])
print(b[1])
when I print both b[0] and b[1] give values of .5 even though b[0] should equal 0. Also in addition to this when I place the '''weighted_sum = np.add(np.dot(W_L_1,A_L_0), B_L_1)''' again after the 'actvation' line it provides the correct result. Its as if the 'activation' line has changed the value of the weighted sum value.
Was wondering if anyone could spread some light on this I can work around this but am interested as to why this is happening. Thanks!!
Inside sigmoid, you're changing the value of the matrix passed as parameter, in this line:
input_matrix[i,j] = ...
If you want to prevent this from happening, create a copy of the matrix before calling sigmoid, and call it like this: sigmoid(copy_of_weighted_sum).

Minimize ‖Ax−b‖ (how to write function to use with scipy.optimize.fmin() )

I am trying to minimize ‖Ax−b‖ through the scipy.optimize.fmin function. The data we use is:
A = np.row_stack([[1,1,2],[1,2,1],[2,1,1],[2,2,1]])
B = np.row_stack([[1],[-1],[1],[-1]])
x is found by x=(AtA)^(−1)Atb, and below is my code for this task.
def find_x(A,B):
At = np.transpose(A) # Transpose A
AtA = np.matmul(At, A) # Multiply A with At
return np.matmul(np.matmul(np.linalg.inv(AtA),At),B)
The assigntment says that I should compare this result with the result of scipy.optimize.fmin(), and from what I have read I need a object/ function for fmin to solve. But I don't really get how I would write the code for that function without it containing x, which is the vector I want to find through the optimization.
I've tried to do the basic thing of defining a function like this:
def f(x):
k = np.subtract(np.matmul(A, x), B)
return np.linalg.norm(k)
And the run it through:
def fmin(x0):
return scipy.optimize.fmin(f(x),x0)
where x0 is some initial guess (same shape as the result from find_x), but I only get a error message "'numpy.float64' object is not callable"

python dblquad invalid callable

I am trying to approximate the Gauss Linking integral for two straight lines in R^3 using dblquad. I've created this pair of lines as an object.
I have a form for the integrand in parametrisation variables s and t generated by a function gaussint(self,s,t) and this is working. I'm then just trying to define a function which returns the double integral over the two intervals [0,1].
Edit - the code for the function looks like this:
def gaussint(self,s,t):
formnum = self.newlens()[0]*self.newlens()[1]*np.sin(test.angle())*np.cos(test.angle())
formdenone = (np.cos(test.angle())**2)*(t*(self.newlens()[0]) - s*(self.newlens()[1]) + self.adists()[0] - self.adists()[1])**2
formdentwo = (np.sin(test.angle())**2)*(t*(self.newlens()[0]) + s*(self.newlens()[1]) + self.adists()[0] + self.adists()[1])**2
fullden = (4 + formdenone + formdentwo)**(3/2)
fullform = formnum/fullden
return fullform
The various other function calls here are just bits of linear algebra - lengths of lines, angle between them and so forth. s and t have been defined as symbols upstream, if they need to be.
The code for the integration then just looks like this (I've separated it out just to try and work out what was going on:
def approxint(self, s, t):
from scipy.integrate import dblquad
return dblquad(self.gaussint(s,t),0,1, lambda t:0,lambda t:1)
Running it gets me a lengthy bit of somewhat impenetrable process messages, followed by
ValueError: invalid callable given
Any idea where I'm going wrong?
Cheers.

Approximating Numerical 2nd Derivative with Python

To preface this question, I understand that it could be done better. But this is a question in a class of mine and I must approach it this way. We cannot use any built in functions or packages.
I need to write a function to approximate the numerical value of the second derivative of a given function using finite difference. The function is below we are using.
2nd Derivative Formula (I lost the login info to my old account so pardon my lack of points and not being able to include images).
My question is this:
I don't understand how to make the python function accept the input function it is to be deriving. If someone puts in the input 2nd_deriv(2x**2 + 4, 6) I dont understand how to evaluate 2x^2 at 6.
If this is unclear, let me know and I can try again to describe. Python is new to me so I am just getting my feet wet.
Thanks
you can pass the function as any other "variable":
def f(x):
return 2*x*x + 4
def d2(fn, x0, h):
return (fn(x0+h) - 2*fn(x0) + fn(x0-h))/(h*h)
print(d2(f, 6, 0.1))
you can't pass a literal expression, you need a function (or a lambda).
def d2(f, x0, h = 1e-9):
func = f
if isinstance(f, str):
# quite insecure, use only with controlled input
func = eval ("lambda x:%s" % (f,))
return (func(x0+h) - 2*func(x0) + func(x0-h))/(2*h)
Then to use it
def g(x):
return 2*x**2 + 4
# using explicit function, forcing h value
print d2(g, 6, 1e-10)
Or directly:
# using lambda and default value for h
print d2(lambda x:2x**2+4, 6)
EDIT
updated to take into account that f can be a string or a function

Categories