Matlab - ecuacion.....AYUDA

 
Vista:

ecuacion.....AYUDA

Publicado por lucera (119 intervenciones) el 20/07/2009 11:26:23
HOLA A TODOS!!!

estoy intentando crear una funcion la cual sirva para calcular cualquier ecuacion que tu introduzcas, por ejemplo: A('56*9*8/3+6').
Tiene que ser en formato de cell array porque es lo que recogemos de un edit text.

He creado el siguiente programa, pero me falla de vez en cuando.

En el programa aparece un apartado para que reconozca ciertas variables y les de el valor correspondiente. Estas valiables estan almacenadas en un archivo .mat vale? a lo mejor el programa es un poco largo.... pero es lo que se me ha ocurrido. Os lo muestro:

function COSTE3=calcular(A)
n=length(A);
a1='0'; a2='0'; a3='0'; a4='0'; a5='0'; a6='0'; a7='0'; a8='0'; a9='0'; a10='0';
a11='0'; a12='0'; a13='0'; a14='0'; a15='0'; a16='0'; a17='0'; a18='0'; a19='0'; a20='0';
v=find(A=='+' | A=='-' | A=='*' | A=='/');
n1=length(v);
for i=1:n
b=A(1,i);
%mostramos un error si introducimos mal la ecuacion
if b~='1' & b~='2' & b~='3' & b~='4' & b~='5' & b~='6' & b~='7' & b~='8' & b~='9' & b~='0' & b~='L' & b~='H'& b~='h'...
& b~='+' & b~='-' & b~='*' & b~='/' & b~='.'
errordlg('Introducir solo numeros o L H h','File Error');
pause
end;
end;
%buscamos los operadores
O=A(v)
str2double(O)
%buscamos los numeros
co=1;
vector=zeros;
load optimization
for j=1:n1
f=v(1,j);
f1=f-1;
numeros=(A(co:f1));
eval(sprintf('a%d=numeros',j));
co=f+1;
%el ultimo numero será:
if j==n1
J=j+1;
s=(A(co:n));
eval(sprintf('a%d=s',J));
end;
end;
%cambiamos las variables por sus correspondientes valores y los guardamos
%en un verctor,caben hasta 20 numeros distintos
load optimization
if a1=='L'
c1=L;
elseif a1=='H'
c1=H;
elseif a1=='h'
c1=h;
elseif a1~='L' & a1~='H' & a1~='h' a1~='0'
c1=str2double(a1);
end;
if a2=='L'
c2=L;
elseif a2=='H'
c2=H;
elseif a2=='h'
c2=h;
elseif a2~='L' & a2~='H' & a2~='h' a2~='0'
c2=str2double(a2);
end;
if a3=='L'
c3=L;
elseif a3=='H'
c3=H;
elseif a3=='h'
c3=h;
elseif a3~='L' & a3~='H' & a3~='h' a3~='0'
c3=str2double(a3);
end;
if a4=='L'
c4=L;
elseif a4=='H'
c4=H;
elseif a4=='h'
c4=h;
elseif a4~='L' & a4~='H' & a4~='h' a4~='0'
c4=str2double(a4);
end;
if a5=='L'
c5=L;
elseif a5=='H'
c5=H;
elseif a5=='h'
c5=h;
elseif a5~='L' & a5~='H' & a5~='h' a5~='0'
c5=str2double(a5);
end;
if a6=='L'
c6=L;
elseif a6=='H'
c6=H;
elseif a6=='h'
c6=h;
elseif a6~='L' & a6~='H' & a6~='h' a6~='0'
c6=str2double(a6);
end;
if a7=='L'
c7=L;
elseif a7=='H'
c7=H;
elseif a7=='h'
c7=h;
elseif a7~='L' & a7~='H' & a7~='h' a7~='0'
c7=str2double(a7);
end;
if a8=='L'
c8=L;
elseif a8=='H'
c8=H;
elseif a8=='h'
c8=h;
elseif a8~='L' & a8~='H' & a8~='h' a8~='0'
c8=str2double(a8);
end;
if a9=='L'
c9=L;
elseif a9=='H'
c9=H;
elseif a9=='h'
c9=h;
elseif a9~='L' & a9~='H' & a9~='h' a9~='0'
c9=str2double(a9);
end;
if a10=='L'
c10=L;
elseif a10=='H'
c10=H;
elseif a10=='h'
c10=h;
elseif a10~='L' & a10~='H' & a10~='h' a10~='0'
c10=str2double(a10);
end;
if a11=='L'
c11=L;
elseif a11=='H'
c11=H;
elseif a11=='h'
c11=h;
elseif a11~='L' & a11~='H' & a11~='h' a11~='0'
c11=str2double(a11);
end;
if a12=='L'
c12=L;
elseif a12=='H'
c12=H;
elseif a12=='h'
c12=h;
elseif a12~='L' & a12~='H' & a12~='h' a12~='0'
c12=str2double(a12);
end;
if a13=='L'
c13=L;
elseif a13=='H'
c13=H;
elseif a13=='h'
c13=h;
elseif a13~='L' & a13~='H' & a13~='h' a13~='0'
c13=str2double(a13);
end;
if a14=='L'
c14=L;
elseif a14=='H'
c14=H;
elseif a14=='h'
c14=h;
elseif a14~='L' & a14~='H' & a14~='h' a14~='0'
c14=str2double(a14);
end;
if a15=='L'
c15=L;
elseif a15=='H'
c15=H;
elseif a15=='h'
c15=h;
elseif a15~='L' & a15~='H' & a15~='h' a15~='0'
c15=str2double(a15);
end;
if a16=='L'
c16=L;
elseif a16=='H'
c16=H;
elseif a16=='h'
c16=h;
elseif a16~='L' & a16~='H' & a16~='h' a16~='0'
c16=str2double(a16);
end;
if a17=='L'
c17=L;
elseif a17=='H'
c17=H;
elseif a17=='h'
c17=h;
elseif a17~='L' & a17~='H' & a17~='h' a17~='0'
c17=str2double(a17);
end;
if a18=='L'
c18=L;
elseif a18=='H'
c18=H;
elseif a18=='h'
c18=h;
elseif a18~='L' & a18~='H' & a18~='h' a18~='0'
c18=str2double(a18);
end;
if a19=='L'
c19=L;
elseif a19=='H'
c19=H;
elseif a19=='h'
c19=h;
elseif a19~='L' & a19~='H' & a19~='h' a19~='0'
c19=str2double(a19);
end;
if a20=='L'
c20=L;
elseif a20=='H'
c20=H;
elseif a20=='h'
c20=h;
elseif a20~='L' & a20~='H' & a20~='h' a20~='0'
c20=str2double(a20);
end;
%creamos un vector con las numeros que nos han salido
c=[c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20];
%creamos un vector sin los ceros:
d=[];
for k=1:20
if c(k)~=0
d(end+1)=c(k);
end;
end;
save calculos c d
m=[];
m1=[];
x2=length(O);
x=numel(O);
x1=length(d);
for k1=1:x
m1(end+1)=O(k1)
end;
O=m1
m1=[]

if x~=0 & numel(O)~=0
for i1=1:x
if x==0
break
end;
if numel(O)<x
return
end;

while O(i1)==42
P=producto(d(i1),d(i1+1));%se realiza el producto
d(i1)=P;%damos el valor del producto al primer termino
d(i1+1)=0;%al siguiente termino damos valor 0
O(i1)=0
for k1=1:x2
if O(k1)~=0 %ajustamos el vector de operadores matematicos
m1(end+1)=O(k1)
end;
end;
for j2=1:x1 %creamos un nuevo vector quitando el termino de valor 0
if d(j2)~=0
m(end+1)=d(j2)
end;
end;
O=m1%damos al vector inicial su nuevo valor
d=m
disp(d)
x=length(O)
if x==0
break
end;
x1=numel(d)
x2=length(O)
m=[];
m1=[];
i1=1;
end;
end;
i1=1
if x==0
return
end;
while O(i1)==47
D=division(d(i1),d(i1+1));%se realiza la disvision
d(i1)=D;%damos el valor del producto al primer termino
d(i1+1)=0;%al siguiente termino damos valor 0
O(i1)=0
for k1=1:x
if O(k1)~=0 %ajustamos el vector de operadores matematicos
m1(end+1)=O(k1);
end;
end;
for j2=1:x1 %creamos un nuevo vector quitando el termino de valor 0
if d(j2)~=0
m(end+1)=d(j2);
end;
end;
O=m1%damos al vector inicial su nuevo valor
d=m
x=length(O)
if x==0
break
end;
x1=length(d)
m=[];
m1=[];
i1=1;

end;
i1=1
if x==0
return
end;

while O(i1)==43
S=suma(d(i1),d(i1+1));%se realiza la suma
d(i1)=S%damos el valor del producto al primer termino
d(i1+1)=0%al siguiente termino damos valor 0
O(i1)=0
if numel(O)~=0
for k1=1:x
if O(k1)~=0 %ajustamos el vector de operadores matematicos
m1(end+1)=O(k1)
end;
end;
end;
for j2=1:x1 %creamos un nuevo vector quitando el termino de valor 0
if d(j2)~=0
m(end+1)=d(j2);
end;
end;
O=m1;%damos al vector inicial su nuevo valor
d=m
x=length(O)
if x==0
break
end;
x1=length(d)
m=[];
m1=[];
i1=1;
end;

i1=1
if x==0
return
end;
while O(i1)==45
R=resta(d(i1),d(i1+1));%se realiza la resta
d(i1)=R;%damos el valor del producto al primer termino
d(i1+1)=0;%al siguiente termino damos valor 0
O(i1)=0
for k1=1:x
if O(k1)~=0 %ajustamos el vector de operadores matematicos
m1(end+1)=O(k1);
end;
end;
for j2=1:x1 %creamos un nuevo vector quitando el termino de valor 0
if d(j2)~=0
m(end+1)=d(j2);
end;
end;
O=m1;%damos al vector inicial su nuevo valor
d=m
x=length(O)
if x==0
break
end;
x1=length(d)
m=[];
m1=[];
i1=1;
end;


x=length(O);
i1=1;
end;
x=length(O);

end

(((((((((((((((((((((((((((estas son las funciones que he creado para que calcule la suma la resta el producto y la division. estan creadas fuera de la funcion COSTE(3)))))))))))))))))))))))))))))))))))))))


function S=suma(t,y)
S=t+y;
disp(S)
end

function R=resta(y,y1)
R=y-y1;
disp(R)
end

function P=producto(t,y)
P=t*y;
disp(P)
end

function D=division(t,y)
D=t/y;
disp(D)
end

(((((((((((((((((((((((((((((ALGUIEN SABE COMO SOLUCIONAR MI PROBLEMA???????))))))))))))))))))))))))))))))))9

ME DA ESTE ESTE ERROR:
Attempted to access O(3); index out of bounds because numel(O)=2.

PERO SOLO DE VEZ EN CUANDO

TAMBIEN ME INTERESARIA INTRODUCIR LOS PARENTESIS DENTRO DE LA ECUACION.

GRACIAS

SALUDOS
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