954,510 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Passing arguments as commands in functions.

Hi all, I was working on a MATLab program and I came to a point where I wanted to define a function such that one of the arguments would be used as a command. To clarify, the function being defined was an implementation of Simpson's rule that would integrate using the technique with given bounds, an even number of intervals, and, finally, the function being integrated. I wanted the user to be able to enter any function of his or her choice, but I'm unaware of any techniques or modules that could help me accomplish that. Although, I'm talking about MATLab I would like to implement a similar function using Python and I take it the technique would be similar for the two. I've included the code I have for MATLab below to better illustrate my query:

function simpsons(a, b, N)
x = linspace(a, b, N + 1);
y = cos(x)./sqrt(1+sin(x)); % This is the function I used for this instance. I want the user to be able to enter any function of their choice and then have MATLab insert the function in place of this one automatically. So instead of "simpsons(a, b, N)", I was thinking about something along the lines of "simpsons(f, a, b, N)", where for 'f' the user can enter expressions such as: "x.^2 + 3.*x + pi^exp(sqrt(pi))", "exp(sin(x))", or "abs(atan(1./x))" to name a few. What would be the best way to do this? I've heard of pointers but I have no idea what they are or if they can even be used for something like this.

s = 0
for k = 2:N
if mod(k, 2) == 0
s += 2*y(k)
else
s += 4*y(k)
end
end

s += y(1) + y(end);
h = (a-b)/N;
Int = h*s/3;
end

Thisisnotanid
Junior Poster in Training
60 posts since Dec 2010
Reputation Points: 10
Solved Threads: 0
 

Please push first [CODE] button and then paste your code or paste code, high light and push code.

I could not decipher your code as end is not defined in expression y(end)

This I got:

from math import *

def simpson(y, a,b,N):
    s = 0
    f = lambda x: eval(y)
    # N not defined -> put as parameter
    for k in range(2,N):
        s += 2*f(k) if k % 2 == 0 else 4*f(k)
    # end not defined replaced a and b
    s += f(a) + f(b)
    h = (a-b)/N
    return h*s/3.

print(simpson(y='cos(x)/sqrt(1+sin(x))', a=1, b=16, N=16))


But it is not probably correct result is -1.7994533931048027 in Python 3.2, but -1.91941695265 in Python 2.7.1 , from these random values for a,b and N.

It's worthwhile for you to investigate Python maths environment Sage, for example http://wiki.sagemath.org/interact/calculus .

pyTony
pyMod
Moderator
5,359 posts since Apr 2010
Reputation Points: 782
Solved Threads: 852
 

Thanks Tony! I got it working. And, the code is not the correct implementation. You're evaluating at k instead of evaluating at the kth point in the interval which is given by a + (b-a)*k/N for b>a

Thisisnotanid
Junior Poster in Training
60 posts since Dec 2010
Reputation Points: 10
Solved Threads: 0
 

I only wrote what could be deciphered from your post without trying to do correct implementation, glad that it helped you enough. Remember [CODE] tags next time!

pyTony
pyMod
Moderator
5,359 posts since Apr 2010
Reputation Points: 782
Solved Threads: 852
 

Cool. Is there a way I can make the editor use MatLab highlighting? The code tags automatically default to Python for the Python forum (I think).

Thisisnotanid
Junior Poster in Training
60 posts since Dec 2010
Reputation Points: 10
Solved Threads: 0
 

[CODE=matlab] seems to work, even your code does not beautify much:

function simpsons(a, b, N)
x = linspace(a, b, N + 1);
y = cos(x)./sqrt(1+sin(x)); % This is the function I used for this instance. I want the user to be able to enter any function of their choice and then have MATLab insert the function in place of this one automatically. So instead of "simpsons(a, b, N)", I was thinking about something along the lines of "simpsons(f, a, b, N)", where for 'f' the user can enter expressions such as: "x.^2 + 3.*x + pi^exp(sqrt(pi))", "exp(sin(x))", or "abs(atan(1./x))" to name a few. What would be the best way to do this? I've heard of pointers but I have no idea what they are or if they can even be used for something like this.

s = 0
for k = 2:N
if mod(k, 2) == 0
s += 2*y(k)
else
s += 4*y(k)
end
end

s += y(1) + y(end);
h = (a-b)/N;
Int = h*s/3;
end
pyTony
pyMod
Moderator
5,359 posts since Apr 2010
Reputation Points: 782
Solved Threads: 852
 

This question has already been solved

Post: Markdown Syntax: Formatting Help
You
View similar articles that have also been tagged: