Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Produce random wavefunction

I need to produce a random curve in matplotlib.

My x values are from say 1 to 1000 for example. I don't want to generate scattered random y values, I need a smooth curve. Like some kind of very distorted sin curve with varying amplitude and wavelength.

Does something already exist to allow me to easily do this?

like image 744
user1551817 Avatar asked Mar 14 '15 14:03

user1551817


1 Answers

Try this code:

import matplotlib.pyplot as pl
import numpy as np

x = np.linspace(1, 10)

def f(x):
    return np.sin(x) + np.random.normal(scale=0.1, size=len(x))

pl.plot(x, f(x))

It will give you a sin wave with some noise added to it:

sin wave with noise

Edit:

It seems like some kind of random walk is what you're looking for. This function will do that for you:

def f(x):
    y = 0
    result = []
    for _ in x:
        result.append(y)
        y += np.random.normal(scale=1)
    return np.array(result)

This is an example of what it can look like (with x = np.linspace(0, 1000, 1000)):

random walk

It's not a function of x any longer though, so the code should probably be refactored to generate a random walk with n steps instead. I'll leave that to you :)

Edit 2:

If you want a smoother curve, you can apply a running mean (stolen from this question):

def runningMean(x, N):
    return np.convolve(x, np.ones((N,))/N)[(N-1):]

pl.plot(x, runningMean(f(x), 10))

The bigger window (the N parameter) you use, the smoother the result.

Example:

random walk with running mean

like image 163
André Laszlo Avatar answered Oct 19 '22 17:10

André Laszlo