convolution of two functions
129 次查看(过去 30 天)
显示 更早的评论
I want to convolve two functions:
f=inline('gaussmf(x,[3,0])','x')
h=inline('normpdf(x,0,4)','x')
So the conv will not work since it only deals with vectors, I have functions I am wanting to convolve.
How do I tell matlab to do this? Do I turn my function into a matrix/vector or something??
0 个评论
回答(3 个)
John BG
2016-8-25
编辑:John BG
2016-8-25
Richard
You don't really need the Symbolic toolbox. MATLAB already have classes to define standard and custom probability functions. For instance to define the Gaussian pdf:
pd1=ProbDistUnivParam('normal',[0 3]);
Since plotting is windowing, you have to define the x range, and then obtain the values of the pdf to input to conv:
x=-10:.1:10;y1=pdf(pd1,x);
The second pdf:
pd2=makedist('Uniform');
pd2.Lower=0;pd2.Upper=4;
y2=pdf(pd2,x);
Now convolving y1 and y2
z=conv(y1,y2);figure(1);plot(x,y1,x,y2);figure(2);plot(z);
The use of function int suggested by Roger comes from the definition of the convolution, that can be obtained with symbolic parameters. But you will need to 'frame' or 'window' anyway when attempting any plot as you mention is your goal here.
Such answer, integrating along t the product pdf1(t)*pdf2(t-x), is explained in the question
with accepted answer by Ghada Saleh, following the key lines of that answer:
syms x b c t;
f1 = a*exp((-x)/(b))+1;
f2 = (1/(4*pi*c^2))*exp((-x^2)/(4*c^2));
f2_c = (1/(4*pi*c^2))*exp((-(t-x)^2)/(4*c^2)); %f2_c = f2(t-x)
result = int(f1*f2_c,t,-inf,inf);
Richard, please if you find my answer useful would you please be so kind to mark my answer as Accepted Answer?
To any other reader, if you find this answer of any help solving your question,
please click on the thumbs-up vote link,
thanks in advance
John BG
1 个评论
Michael Reshko
2019-4-4
You begin with two functions defined on [-10:10], but your last plot of the convolution is on [0; 450]. What are the x values corresponding to the convolution z?
Roger Stafford
2013-9-2
This is hopefully a problem that the symbolic toolbox's 'int' function could solve for you. The convolution of the two functions you have given can be expressed as:
F(t) = int(f(s)*h(t-s),'s',-inf,+inf)
If 'int' can get an answer, it will depend on t and that will be your convolution function.
The reason I have hope that 'int' can succeed in this is that I know I could solve it by hand. Your integrand would look something like this:
exp(-s^2/18)*1/sqrt(2*pi)/4*exp(-(t-s)^2/32) =
1/sqrt(2*pi)/4 * exp(-s^2/18-(t-s)^2/32)
The quantity within 'exp' is a quadratic in s and by doing a "completion of the square" it can be expressed in the form
exp(-(s-a)/(2*b^2)) * something that doesn't depend on s
where a and b are certain quantities which depend on t. Hence this is something that can be evaluated exactly as a function of t (with sufficient sweat.) But as I say, hopefully 'int' could save you that sweat.
Roger Stafford
2013-9-2
I was hoping 'int' would solve this for you. Shame on 'int'! Oh well, assisted by my own ancient symbolic toolbox, I have hand-derived the convolution function for you. It is simply this. With the functions
f(x) = gaussmf(x,[sg,mg])
h(x) = normpdf(x,mn,sn))
their convolution will be:
F(t) = int(f(s)*h(t-s),'s',-inf,inf) =
sg/sqrt(sg^2+sn^2) * exp(-(t-mn-mg)^2/(2*(sg^2+sn^2)))
You can plug in your desired values for the mean and standard deviation for the two distributions as values for mg, sg, mn, sn.
2 个评论
Roger Stafford
2013-9-4
You don't actually need to use 'trapz' to find the area under F(t). There is an exact answer.
int(F(t),'t','-inf','inf') =
sg/sqrt(sg^2+sn^2) * sqrt(2*pi)*sqrt(sg^2+sn^2) =
sqrt(2*pi)*sg
which interestingly enough is the normalizing factor whose reciprocal is needed to convert the 'gaussmf' gaussian membership function to a normal pdf distribution.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 MuPAD 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!