function f(x)=xe^x

33 views (last 30 days)
Deanna Jaramillo
Deanna Jaramillo on 24 Aug 2019
Commented: Steven Lord on 27 Aug 2019
Write a function my_fun.m which returns the value of f(x)=xe^x given an input x. This
function should be a function of x only.
  3 Comments
Deanna Jaramillo
Deanna Jaramillo on 27 Aug 2019
yes it was a homework problem. I do not understand much code and I am wanting to learn. The instructor showed us some 'for' loops and 'while' loops and a function program and I am not sure when to use what. Here is the question for the first part.
a) Considering the function
f(x) = xe^x (1)
(a) Write a function my_fun.m which returns the value of (1) given an input x. This function should be a function of x only.
I came up with:
function y=my_fun(x)
y=x*exp(x);
end
Then the next part:
b) Write a function my_mean.m which takes four arguments: 1) a function (my_fun.m), 2) a number a, 3) another number b satisfying a ≤ b, and 4) a positive integer N. This function should return an approximate value for:
Capture.PNG (2)
Where f(x) represents (1). The approximate value of (2) should be calculated via:
Capture.PNG
where:
h = (b − a)/ N , xj = a + (j − 1)h
HW #1 For example, a call to the function would resemble:
my_mean(@my_fun, 0, 5, 100)
(c) Use my_mean.m and my_fun.m to compute an approximation to
Capture.PNG
In this case the exact solution for (4) can be computed as:
1/ e
Plot (using semilogy) the absolute error between M and your approximations versus N for:
N(n) = 2n , 1 ≤ n ≤ 13
So, for the codes, I have:
function y= my_mean(my_fun,a,b,N)
h=(b-a)/N;
x=linspace(a,b,N);
y=0;
for j=1:length(x)
y = (1/N)*(a+((j-1)*h));
end
end
and the final for the output plot:
close all
clear
clc
format longg
n=1:13;
N=2.^n;
M=0;
for j=1:length(N)
M(j)=abs(my_mean(@my_fun,-1,1,N(j)));
end
semilogy(N,M,'-ob');
xlabel('N', 'Fontsize', 10);
ylabel('M', 'Fontsize', 10);
title('Absolute Error', 'Fontsize', 15)
I got the plot to show up but the y-axis goes from 10^-4 to 10^-1, when the instructor's goes from 10^-4 to 10^0.
How do I know what to use when?
-Deanna
Steven Lord
Steven Lord on 27 Aug 2019
James already discussed your parts b and c, so I just want to offer a little extra information. This is slightly more advanced than you may have learned so far, but it's something that can come in very useful when working with MATLAB.
For part a your function will work as long as the x input to my_fun is a scalar (just one number.) You could modify it ever so slightly to allow it to work on any sized array (a scalar, a vector with ten elements, a 5-by-5 matrix, a 2-by-3-by-4-by-5-by-6 array, etc.) by using the array multiplication operator .* instead of the matrix multiplication operator *. [For scalars they behave the same; for non-scalars they don't.] See the Array vs. Matrix Operations documentation page for more information.

Sign in to comment.

Answers (2)

Star Strider
Star Strider on 24 Aug 2019

James Tursa
James Tursa on 27 Aug 2019
Edited: James Tursa on 27 Aug 2019
Take a look at this loop from your code:
for j=1:length(x)
y = (1/N)*(a+((j-1)*h)); % <-- This replaces y at each step ... it doesn't sum anything up!
end
And compare it to the summation (3) in the instructions. Two problems: You are not calling your function, and you are not summing anything up. You should be summing up f(xj) values (N of them) and then dividing that sum by N according to the (3) formula. So the loop should be something like this instead:
for j=1:N % <-- Use the limits in the (3) formula
y = y + my_fun(a+(j-1)*h); % <-- Sums up individual calculations into y
end
y = y/N;
You don't need (or want) that x-linspace(etc) call.

Categories

Find more on General Applications in Help Center and File Exchange

Products


Release

R2019a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!