Matlab - error: value on right hand side of assignment is undefined

 
Vista:
sin imagen de perfil
Val: 48
Ha aumentado su posición en 2 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

error: value on right hand side of assignment is undefined

Publicado por benjamin (17 intervenciones) el 11/11/2020 21:11:27
Hola buenas, tengo que hacer un metodo de biseccion pero cuando hago run me tira una cierta cantidad de resultados y luego el error "error: value on right hand side of assignment is undefined", como puedo solucionarlo?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function sol=biseccion(f,a,b,tol,N)
  i=1;
 
  a(1)=a;
  b(1)=b;
  x(1)=(a(1)+b(1))/2;
        if f(a(1))*f(x(1))<0
    a(2)=a(1);
    b(2)=x(1);
 
        else
    a(2)=x(1);
    b(2)=b(1);
  endif
  x(2)=(a(2)+b(2))/2;
 
 
 while  abs(x(i+1)-x(i))>tol && i<=N
 
if f(a(i+1))*f(x(i+1))<0
     a(i+2)=a(i+1);
     b(i+2)=x(i+1);
   else
     a(i+2)=x(i+1);
     b(i+2)=b(i+1);
   endif
   x(2+i)=(a(2+i)+b(2+i))/2;
   i=i+1;
 
 
endwhile
endfunction

El codigo esta hecho en Octave y tengo otro codigo donde tengo solo la funcion que uso que es:

1
2
3
function y = f(x)
  y = 0.487*(sin (x))*(cos (x))+2.197*((sin (x))^2)-0.263*(cos (x))-1.189*(sin (x))
endfunction


Y este es el codigo que recibe todo lo anterior y lo ejecuta:

1
2
3
4
5
6
7
8
9
10
11
12
clc
clear
close all
 
 
 
f=@f;
a=0;
b=1;
N = 50;
tol = 10^-5;
sol = biseccion(f,a,b,tol,N)

Si alguien me puede decir que debo agregar o eliminar seria de mucha ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Jon
Val: 354
Ha aumentado 1 puesto en Matlab (en relación al último mes)
Gráfica de Matlab

error: value on right hand side of assignment is undefined

Publicado por Jon (161 intervenciones) el 12/11/2020 08:33:26
Buenas,

Ese error ocurre al guardar datos en un array (normalmente cuando intentas guardar un array en una posición de otro array).

Acabo de probar tu código en MATLAB y no me devuelve ningún error.

Si la variable sol se corresponde con x, la solución final es la siguiente:

1
x = 0.5715

Un saludo,

Jon
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 48
Ha aumentado su posición en 2 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

error: value on right hand side of assignment is undefined

Publicado por benjamin (17 intervenciones) el 12/11/2020 13:39:16
Hola Jon, muchas gracias por responder a mi pregunta me ayudaste mucho, me gustaria saber si cuando lo pasaste a MATLAB le cambiaste algo al codigo? ya que al pasarlo a MATLAB me tira error con la funcion "Error in f (line 3)
y=0.487*(sin (x))*(cos (x))+2.197*((sin (x))^2)-0.263*(cos (x))-1.189*(sin (x));", Sabes si debo hacerle algun cambio?

Estuve probando con algunos handle ya que en octave solo hacia f=@f, pero tuve que hacerlo de otra manera porque matlab no lo detectaba y me aparecian error, ahora tengo esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
clc
clear
close all
 
 
f=@(x)0.487*(sin (x))*(cos (x))+2.197*((sin (x))^2)-0.263*(cos (x))-1.189*(sin (x));
 
a=0;
b=1;
N = 50;
tol = 10^-5;
sol=biseccion(f,a,b,tol,N)
 
figure
subplot(2,1,1)
plot(sol, "bo")

y esto:

1
2
3
4
5
6
function [y]= f(x)
 f=@(x)0.487*(sin (x))*(cos (x))+2.197*((sin (x))^2)-0.263*(cos (x))-1.189*(sin (x));
 y=0.487*(sin (x))*(cos (x))+2.197*((sin (x))^2)-0.263*(cos (x))-1.189*(sin (x));
 
 
end


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function sol=biseccion(f,a,b,tol,N)
  i=1;
 
  a(1)=a;
  b(1)=b;
  x(1)=(a(1)+b(1))/2;
        if f(a(1))*f(x(1))<0
    a(2)=a(1);
    b(2)=x(1);
 
        else
    a(2)=x(1);
    b(2)=b(1);
        end
  x(2)=(a(2)+b(2))/2;
 
 
 while  abs(x(i+1)-x(i))>tol && i<=N
 
if f(a(i+1))*f(x(i+1))<0
     a(i+2)=a(i+1);
     b(i+2)=x(i+1);
   else
     a(i+2)=x(i+1);
     b(i+2)=b(i+1);
end
   x(2+i)=(a(2+i)+b(2+i))/2;
   i=i+1;
 
 
 end
end


pero MATLAB me tira un error que dice "Output argument "sol" (and maybe others) not assigned during call to "biseccion".

Error in MetodoBiseccion (line 12)
sol=biseccion(f,a,b,tol,N)"

y eso si que no se como arreglarlo, si tu me puedes decir que debo modificar seria genial
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 48
Ha aumentado su posición en 2 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

error: value on right hand side of assignment is undefined

Publicado por benjamin (17 intervenciones) el 12/11/2020 14:17:13
Actualizo: ya pude arreglarlo solo tenia que hacer un pequeño cambio asi que muchas gracias a Jon por la ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jon
Val: 354
Ha aumentado 1 puesto en Matlab (en relación al último mes)
Gráfica de Matlab

error: value on right hand side of assignment is undefined

Publicado por Jon (161 intervenciones) el 12/11/2020 15:06:31
Perfecto, me alegro =D

De todas formas, respondo la pregunta, por si a alguien en el futuro le sirve. En MATLAB el final de los bucles while se define con end y el final de una función también, aunque ésta última sea opcional.

Hasta donde yo sé, en MATLAB no hace falta definir la siguiente línea de código. Simplemente, la función f.m tiene que estar en la misma carpeta que el programa principal (a no ser que tengas definido un path o lo definas mediante programa).

1
f=@f

Ah, y obviamente la salida de la función tiene que estar definida en la función. Es decir, en este caso la salida de la función f.m será x.

Un saludo,

Jon
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 918
Bronce
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

error: value on right hand side of assignment is undefined

Publicado por Daniel (354 intervenciones) el 12/11/2020 20:48:14
Hola,

En el código es necesario hacer eso. Lo que hace con @f es convertir la función f en una función handle, por lo cual se pude pasar como parámetro de una función.Por ejemplo, se podría pasar a una función fun(@cos), pero nunca fun(cos), salvo que se hubiese defino una variable llamada sin.

1
2
3
4
5
6
>> fun = @(x)x(0);
>> fun(@cos)
 
ans =
 
     1

En este caso fun ejecuta la función que se le pasa con valor 0.

Saludos,
Daniel Rodríguez
Analytics Lane
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar