Error converting function handle to double?

20 次查看(过去 30 天)
Hey guys, any idea why this won't run? I attached the code below as well as the original problem. Thanks!
% HW 9
% define the mesh in space
dx = 1e-2;
x = 0:dx:10;
x = x';
% define the mesh in time
dt = 1e-4;
t = 0:dt:2;
c = 1/2;
% display('this number should be between -1 and 1 for stability:')
mu = c*dt/dx;
% choose the wave number of the initial data and give its decay rate
u = zeros(N+1,M+1);
u(:,1) = @(t) exp(-20*((x-3)^2));
u_exact(:,1) = u(:,1);
% I want to do the Lax Wendroff scheme:
%
% u_new(j) = u_old(j) - (mu/2)*(u_old(j+1)-u_old(j-1))
% + (mu^2/2)*(u_old(j-1)-2*u_old(j)+u_old(j+1))
for j=1:M
for k=2:N
u(k,j+1) = u(k,j) - (mu/2)*(u(k+1,j)-u(k-1,j)) + (mu^2/2)*(u(k+1,j)-2*u(k,j)+u(k-1,j));
end
% I code in the exact values at the endpoints.
u(1,j+1)=1;
u(N+1,j+1)=0;
X = x-c*t(j+1);
u_exact(:,j+1) = @(t) 0.4*sin(2*t);
end

回答(2 个)

Geoff Hayes
Geoff Hayes 2016-5-5
Pizza Pie - the full error message is
The following error occurred converting from function_handle to double:
Error using double
Conversion to double from function_handle is not possible.
Error in ***** (line 18)
u(:,1) = @(t) exp(-20*((x-3)^2));
You have defined u as a matrix of zeros (doubles) with the line of code
u = zeros(N+1,M+1);
and then you are trying to assign a anonymous function handle to all elements in the first column of u. Hence the error.
I suspect that you want to evaluate the expression instead though it is unclear how t should be used in it. If, for the moment, we ignore the t then something like the following will work
u(:,1) = exp(-20*((x-3).^2));
(The above assumes that N is 1000.)
What is the expression that you wish to evaluate? How should t be used?
  3 个评论
Geoff Hayes
Geoff Hayes 2016-5-5
There is no image attached.
Please copy and paste the full error message. Also, what are N and M?

请先登录,再进行评论。


Star Strider
Star Strider 2016-5-5
The problem is with your anonymous functions. I created versions that work, and made what seem to me to be the appropriate substitutions in your ‘u’ and ‘u_exact’ assignments. (You didn’t supply ‘N’ and ‘M’, so I made up some values for them to test the code.) I will leave you to determine if your code with my changes produces the correct results:
N = 3;
M = 4;
% define the mesh in space
dx = 1e-2;
x = 0:dx:10;
x = x';
% define the mesh in time
dt = 1e-4;
t = 0:dt:2;
c = 1/2;
% display('this number should be between -1 and 1 for stability:')
mu = c*dt/dx;
% choose the wave number of the initial data and give its decay rate
u = zeros(N+1,M+1);
u_fcn = @(x) exp(-20*((x-3).^2)); % <— CONVERT TO ANONYMOUS FUNCTION
u_exact_fcn = @(t) 0.4*sin(2*t); % <— CONVERT TO ANONYMOUS FUNCTION
u_exact(:,1) = u_fcn(u(:,1));
% I want to do the Lax Wendroff scheme:
%
% u_new(j) = u_old(j) - (mu/2)*(u_old(j+1)-u_old(j-1))
% + (mu^2/2)*(u_old(j-1)-2*u_old(j)+u_old(j+1))
for j=1:M
for k=2:N
u(k,j+1) = u_fcn(u(k,j)) - (mu/2)*(u_fcn(u(k+1,j))-u_fcn(u(k-1,j))) + (mu^2/2)*(u_fcn(u(k+1,j))-2*u_fcn(u(k,j))+u_fcn(u(k-1,j)));
end
% I code in the exact values at the endpoints.
u(1,j+1)=1;
u(N+1,j+1)=0;
X = x-c*t(j+1);
u_exact(:,j+1) = u_exact_fcn(t(j));
end
  2 个评论
Pizza Pie
Pizza Pie 2016-5-5
This isn't giving me any error messages so far, however - how would i go about plotting this every 10% of the way? I can't use the normal plot function like this so I'm guessing it has to be in the for loop somewhere?
Star Strider
Star Strider 2016-5-5
What do you want to plot?
Also, does the notation in the screen shot image indicate that this is a homegeneous partial differntial equation?

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Startup and Shutdown 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by