function f(x)=xe^x

28 ビュー (過去 30 日間)
Deanna Jaramillo
Deanna Jaramillo 2019 年 8 月 24 日
コメント済み: Steven Lord 2019 年 8 月 27 日
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 件のコメント
Deanna Jaramillo
Deanna Jaramillo 2019 年 8 月 27 日
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 2019 年 8 月 27 日
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.

サインインしてコメントする。

回答 (2 件)

Star Strider
Star Strider 2019 年 8 月 24 日

James Tursa
James Tursa 2019 年 8 月 27 日
編集済み: James Tursa 2019 年 8 月 27 日
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.

カテゴリ

Help Center および File ExchangeGeneral Applications についてさらに検索

製品


リリース

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by