Solve equation without Symbolic Math Toolbox for Compiler
    8 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
I have a very long implicit equation. Actually I solve this equation using 'syms' and 'vpasolve'.  
    syms R % R is the only unknown variable, all others are known
    g = ((1+nu)*(1-2*nu)*(1-1/(R/b0)^2))/((alpha-1)-(1-2*nu)*(1+alpha)/(R/b0)^2);
    omega = -(2*(1-2*nu)*(1-nu^2))/(delta*(alpha-1))*((alpha+1/beta)-(nu/(1-nu))*(1+alpha/beta))/...
        ((alpha-1)-((1-2*nu)*(1+alpha)/(R/b0)^2))/(R/b0)^2;
    S1 = 0;     % sommatoria manuale
    for n=0:1:10
        if n==gam
            S = k*omega^n/factorial(n)*log(R/a);
        else
            S = (omega^n/(factorial(n)*(n-gam))*((R/a)^(k*(n-gam))-1));
        end
        S1=S1+S;
    end        
    eqn = (nn/gam)*((1-g/delta)^((beta+1)/beta)-(a0/R)^((beta+1)/beta)) == S1;  
    sol_R = vpasolve(eqn, R, [a0 Rpl_max]);    % solution
The problem is that I want to compile this equation in a standalone application but Matlab Compiler does not support Symbolic Math Toolbox. 
First I tried to convert the symbolic expression into a anonymous funcion, as follow.
syms a a0 alpha0 b0 beta0 delta0 gam k nn nu0
syms R 
g = ((1+nu0)*(1-2*nu0)*(1-1/(R/b0)^2))/((alpha0-1)-(1-2*nu0)*(1+alpha0)/(R/b0)^2);
omega = -(2*(1-2*nu0)*(1-nu0^2))/(delta0*(alpha0-1))*((alpha0+1/beta0)-(nu0/(1-nu0))*(1+alpha0/beta0))/((alpha0-1)-((1-2*nu0)*(1+alpha0)/(R/b0)^2))/(R/b0)^2;
S1 = sym(0);    
for n=0:1:10
    %piecewise is needed to test against a value to be determined later
    S = piecewise(n == gam, ...
        k*omega^n/factorial(n)*log(R/a), ...
        (omega^n/(factorial(n)*(n-gam))*((R/a)^(k*(n-gam))-1)) );
    S1=S1+S;
end    
EQN = (nn/gam)*((1-g/delta0)^((beta0+1)/beta0)-(a0/R)^((beta0+1)/beta0)) - S1;  
matlabFunction(EQN, 'file', 'EQN.m', 'vars', {R, [a, a0, alpha0, b0, beta0, delta0, gam, k, nn, nu0]})
After this, I tried to solve it in different ways:
1st way) I can't use vpasolve for function_handle.
2nd way) Using fzero instead of vpasolve I can find a solution, but only if function changes sign. Therefor sometimes I get errors.  
    parameters = [a, a0, alpha, b0, beta, delta, gam, k, nn, nu]; 
    obj = @(R) EQN(R, parameters);
    sol_R = fzero(obj, [a0 Rpl_max]);    
3rd way) Using fsolve I got same error of vpasolve. 
Is there a way to reach my goal? 
0 comentarios
Respuestas (1)
  Ameer Hamza
      
      
 el 20 de Abr. de 2020
        I guess you are trying to run these lines 
parameters = [a, a0, alpha, b0, beta, delta, gam, k, nn, nu]; 
obj = @(R) EQN(R, parameters);
sol_R = fzero(obj, [a0 Rpl_max]); 
without clearing the variable EQN from your workspace. When MATLAB creates the anonymous function obj, it picks EQN from the workspace, which is a symbolic variable, and hence you get such error. Try to run the above lines after cleaning the variable EQN from workspace
clear EQN
0 comentarios
Ver también
Categorías
				Más información sobre Symbolic Math Toolbox en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

