Double summation and surface plot?

2 views (last 30 days)
Could someone please show me the right way to do what I'm trying to do? Below is the description.
I have a function f that takes in 5 arguments z,x,y,n,m. The order of events should go as follows:
1. Upon calling the function test, the variable z is assigned, say z = 1.
2. A linear combination is created by adding f with with each of elements of ni inserted and the result is stored in fn, as such (z = 1, so no more z variable):
fn = x + 2.*y + exp(0) - sqrt(m) +
x + 2.*y + exp(2) - sqrt(m) +
x + 2.*y + exp(4) - sqrt(m) +
x + 2.*y + exp(6) - sqrt(m) +
x + 2.*y + exp(8) - sqrt(m) +
x + 2.*y + exp(10) - sqrt(m) =
6*x + 12*y + 1 + exp(2) + exp(4) + exp(6) + exp(8) + exp(10) - 6*sqrt(m) =
6*x + 12*y + 25473.8 - 6*sqrt(m)
3. A linear combination is created by adding fn with each of elements of mi inserted and the result is stored in fnm. (I don't know how to do 1. and 2. simultaneously. If you do, please let me know):
fnm = 6*x + 12*y + 1 + exp(2) + exp(4) + exp(6) + exp(8) + exp(10) - 6*sqrt(0) +
6*x + 12*y + 1 + exp(2) + exp(4) + exp(6) + exp(8) + exp(10) - 6*sqrt(2) +
6*x + 12*y + 1 + exp(2) + exp(4) + exp(6) + exp(8) + exp(10) - 6*sqrt(4) +
6*x + 12*y + 1 + exp(2) + exp(4) + exp(6) + exp(8) + exp(10) - 6*sqrt(6) +
6*x + 12*y + 1 + exp(2) + exp(4) + exp(6) + exp(8) + exp(10) - 6*sqrt(8) +
6*x + 12*y + 1 + exp(2) + exp(4) + exp(6) + exp(8) + exp(10) - 6*sqrt(10) =
6*x + 12*y + 25453.1
4. A surface is plotted by plugging in x and y from arrays xi and yi into fnm.
Here is my code:
function test(z)
f = @(z,x,y,n,m) z.*x + 2.*y + exp(n) - sqrt(m);
function s(z)
ni = 0:2:10;
mi = 0:2:10;
xi = -5:5;
yi = -5:5;
fn = @(n) arrayfun(@(z, x, y, ni, m) sum(f(z, x, y, ni, m)),n);
fnm = @(m) arrayfun(@(x, y, mi) sum(fn(x, y, mi)),m);
zz = sym(fnm);
[xx,yy] = meshgrid(xi,yi);
surf(xx,yy,zz)
end
s
end
I can't figure out why I'm getting so many errors.
Error using test2>@(x,y,mi)sum(fn(x,y,mi)) (line 11)
Not enough input arguments.
Error in test2>@(m)arrayfun(@(x,y,mi)sum(fn(x,y,mi)),m) (line 11)
fnm = @(m) arrayfun(@(x, y, mi) sum(fn(x, y, mi)),m);
Error in sym>funchandle2ref (line 1209)
S = x(S{:});
Error in sym>tomupad (line 1114)
x = funchandle2ref(x);
Error in sym (line 151)
S.s = tomupad(x);
Error in test2/s (line 12)
zz = sym(fnm);
Error in test2 (line 18)
s

Accepted Answer

Walter Roberson
Walter Roberson on 25 May 2015
Edited: Walter Roberson on 26 Feb 2017
Why are you trying to take sym(fnm) ? sym() invokes the symbolic toolbox to convert the given input to a symbolic variable. Even if you succeeded, the result would be a symbolic variable, and your later line
surf(xx,yy,zz)
would be attempting to use that symbolic variable in the third position of surf() where a numeric variable is expected.
What I suggest you do use use ndgrid
[x, y, n, m] = ndgrid(xi, yi, ni, mi);
allz = f(z, x, y, n, m);
[xx, yy] = ndgrid(xi, yi);
zz = sum(sum(allz,4),3);
surf(xx, yy, zz);
  2 Comments
zhuoran dong
zhuoran dong on 25 Feb 2017
I run this code but it turns out that 'Error using surf (line 82) Data dimensions must agree'
Walter Roberson
Walter Roberson on 26 Feb 2017
It works fine when I test it:
>> ni = 0:2:10;
mi = 0:2:10;
xi = -5:5;
yi = -5:5;
>> f = @(z,x,y,n,m) z.*x + 2.*y + exp(n) - sqrt(m);
>> z = 1
z =
1
>> [x, y, n, m] = ndgrid(xi, yi, ni, mi);
allz = f(z, x, y, n, m);
>> size(allz)
ans =
11 11 6 6
>> zz = sum(sum(allz,4),3);
>> size(zz)
ans =
11 11
>> [xx, yy] = ndgrid(xi, yi);
>> size(xx)
ans =
11 11
>> surf(xx, yy, zz);

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!