Double summation and surface plot?
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Solarmew
el 25 de Mayo de 2015
Comentada: Walter Roberson
el 26 de Feb. de 2017
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
0 comentarios
Respuesta aceptada
Walter Roberson
el 25 de Mayo de 2015
Editada: Walter Roberson
el 26 de Feb. de 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 comentarios
zhuoran dong
el 25 de Feb. de 2017
I run this code but it turns out that 'Error using surf (line 82) Data dimensions must agree'
Walter Roberson
el 26 de Feb. de 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);
Más respuestas (0)
Ver también
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!