### Agata (view profile)

on 16 Oct 2011
Latest activity Commented on by Walter Roberson

on 25 Sep 2016

### Fangjun Jiang (view profile)

Hello! I'm extremely new to Matlab, and I'm working on a homework problem, and I keep coming up with an error... I've written my functions, and defined some variables to be plugged into them. I can't even call my functions, because I get the error for writing them.

This all has to be in one m-file so I cannot save the functions in different ones... I'm not sure what to do :(

```function [x,y,vx,vy] = trajectory(t,v0,th0,h0,g)
```
```x = v0 .* cos(th0) .* t;
y = h0 + (v0 .* sin(th0) .* t) - ((1./2) .* g .* (t.^2));
vx = v0 .* cos(th0);
vy = (v0 .* sin(th0)) - (g .* t);
```
```function y = height(t,v0,th0,h0,g)
```
```[x,y,vx,vy] = trajectory(t,v0,th0,h0,g);
```
```%(b)
v0 = 20;
th0 = 45;
h0 = 5;
g = 9.81;
t = linspace(1,4,400);
```
```y = height(t,v0,th0,h0,g)
```

Mamoona Yousaf

### Mamoona Yousaf (view profile)

on 25 Sep 2016

Function definitions are not permitted in this context. plz tell me the meaning of this error

Image Analyst

### Image Analyst (view profile)

on 25 Sep 2016

Essentially, the code simplifies down to this:

```function a = trajectory
a=10
```
```function height
b = trajectory
c = height
```

There is nothing wrong with having that all in the same m-file. You can run it and won't get the error. Basically it runs trajectory, which never calls height at all. If it did, then since height calls trajectory, you could get an infinite loop because it would never stop.

What they probably did (but did not show) was to define t,v0,th0,h0,g in the same m-file, and this turned the two-function file (which is allowed) into a script+(2 functions) file which is not allowed. You can't start out an m-file with a script (like defining input arguments) and then follow up with function definitions. You can have a script only, or multiple functions, but not both in the same m-file.

Walter Roberson

### Walter Roberson (view profile)

on 25 Sep 2016

Image Analyst: scripts can now have functions in them, as of R2016b.

## Products

No products are associated with this question.

### Fangjun Jiang (view profile)

on 16 Oct 2011

You need to understand the difference between M-script and M-function.

If the first line of your .m file is a function definition like you have in the code. This .m file is a M-function.

If the first line of your .m file is not a function definition, but other M command or M code, the .m file is called M-script.

You can not have M-function definition in M-script. That is the error message tries to tell you.

You can save the two functions you have in two .m file and then write a script to call the function.

Jan Simon

### Jan Simon (view profile)

on 16 Oct 2011

It becomes an evergreen and should be included in the FAQ.

binh

### binh (view profile)

on 12 Apr 2013

thanks for your answer! I split this function to another .m file and it worked!

### Walter Roberson (view profile)

on 16 Oct 2011

In addition to what Fangjun wrote:

When you are not already executing within a given file, MATLAB can only find the very first function in that file, and that first function name must be the same name as the file.

Therefore, the order of functions in the file should be that the very first one is the "driver" function (the one that sets up everything and calls the other functions to do the work), and the functions that do the internal work should be after that in the file.

If you look at the function order you have coded above, you have coded the internal routine first, and then coded a routine that calls that internal routine. You would, however, not be able to activate that second routine from the MATLAB command line.

So... what you need to do is take the line that start at %(b) through to the end of the file, and move those lines to the beginning of the file, and then you have to insert a "function" line at the very top, naming it appropriately for your assignment conditions. I can see from the code that those lines set things up and then call the internal routines, so those lines should be in the first function.

### Kamil Kasic (view profile)

on 28 Jan 2014
Edited by Walter Roberson

### Walter Roberson (view profile)

on 28 Jan 2014

What is wrong here?

basic example from Matlab help:

```function y = average(x)
if ~isvector(x)
error('Input must be a vector')
end
y = sum(x)/length(x);
end
function y = average(x)
|
Error: Function definitions are not permitted in this context.
```

Walter Roberson

### Walter Roberson (view profile)

on 28 Jan 2014

You need to store that in a file named average.m and run it from the file. You cannot create functions at the command prompt.

Alexandria James

### Alexandria James (view profile)

on 9 Jan 2016

Thank you! This was much simpler to understand!

### Gedion Teklewolde (view profile)

on 26 Mar 2014
Edited by Gedion Teklewolde

### Gedion Teklewolde (view profile)

on 26 Mar 2014

Even when it is saved in appropriate name file.m it still fails.

```clc
clear
clc
%
% Newton-Raphson method
%
function [x0,err] = newraph(x0)
maxit = 100;
tol = 1.0e-6;
err = 100.0;
icount = 0;
xold =x0;
while (err > tol & icount <= maxit)
icount = icount + 1;
f = funkeval(xold);
df = dfunkeval(xold);
xnew = xold - f/df;
if (icount > 1)
err = abs((xnew - xold)/xnew);
end
fprintf(1,'icount = %i xold = %e f = %e df = %e xnew = %e err = %e \n',icount, xold, f, df, xnew, err);
xold = xnew;
end
%
x0 = xnew;
if (icount >= maxit)
% you ran out of iterations
fprintf(1,'Sorry. You did not converge in %i iterations.\n',maxit);
fprintf(1,'The final value of x was %e \n', x0);
end
function f = funkeval(x)
f = x + log(x);
function df = dfunkeval(x)
df = 1 + 1/x;
```

Walter Roberson

### Walter Roberson (view profile)

on 10 Jan 2016

It is not clear what was stored in which file. The 'clc' at the top of the code is not the word 'function' or 'classdef' so whatever code is in the same file as the 'clc' is part of a "script" rather than a function file. Function files must start with "function", and functions can also be defined in "classdef" files, but functions cannot be defined in scripts.

#### Join the 15-year community celebration.

Play games and win prizes!

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi