How to convert the integral of a long and complicated symbolic expression into a function file

1 view (last 30 days)
I use Matlab's built-in matlabFunction() to convert symbolic expressions into optimized function handles or files.
Consider the following example:
clc; clear; close all; format shorteng;
syms gm1 gm2 gm3 gm4 gs1 gs2 gs3 gs4 gds1 gds2 gds3 gds4
syms Cgs1 Cgs2 Cgs3 Cgs4 Cgd1 Cgd2 Cgd3 Cgd4
syms f s Gref Ga Gb A
syms Lambda1 Lambda2 Lambda3 Lambda4 gamma3 gamma4 phi3 phi4 vsb3 vsb4
syms ids1 ids2 ids3 ids4
syms KP1 KP2 KP3 KP4 Cox1 Cox2 Cox3 Cox4
syms W1 W2 W3 W4 L1 L2 L3 L4 Lov1 Lov2 Lov3 Lov4
Tn = (3301802341529731*gm2*(Ga + Gb)^2*(gds4 + gm4 + gs4)^2)/(332306998946228968225951765070086144*abs(gds4*gm4 + gds4*gs4 - (Ga + Gb + gds4 + Cgd4*f*pi*2i)*(gds2 + gds4 + gm4 + gs4 + Cgd2*f*pi*2i + Cgs4*f*pi*2i) + gds4^2)^2) + (3301802341529731*gm4*abs(gds2 + pi*Cgd2*f*2i + pi*Cgs4*f*2i)^2*(Ga + Gb)^2)/(332306998946228968225951765070086144*abs(gds4*gm4 + gds4*gs4 - (Ga + Gb + gds4 + Cgd4*f*pi*2i)*(gds2 + gds4 + gm4 + gs4 + Cgd2*f*pi*2i + Cgs4*f*pi*2i) + gds4^2)^2) + (3301802341529731*A^2*gm3*abs((gm2 - pi*Cgd3*f*2i)*(gds1 + pi*Cgd1*f*2i + pi*Cgs3*f*2i))^2*(Ga + Gb)^2*(gds4 + gm4 + gs4)^2)/(332306998946228968225951765070086144*abs(gds4*(gds3 - A*gm1 + A*Cgd1*f*pi*2i)*(gds3 + gm3 + gs3)*(gds4 + gm4 + gs4) - gds4*(Gref + gds3 + Cgd3*f*pi*2i)*(gds4 + gm4 + gs4)*(gds1 + gds3 + gm3 + gs3 + Cgd1*f*pi*2i + Cgs3*f*pi*2i) - (gds3 - A*gm1 + A*Cgd1*f*pi*2i)*(gds3 + gm3 + gs3)*(Ga + Gb + gds4 + Cgd4*f*pi*2i)*(gds2 + gds4 + gm4 + gs4 + Cgd2*f*pi*2i + Cgs4*f*pi*2i) + (Gref + gds3 + Cgd3*f*pi*2i)*(Ga + Gb + gds4 + Cgd4*f*pi*2i)*(gds1 + gds3 + gm3 + gs3 + Cgd1*f*pi*2i + Cgs3*f*pi*2i)*(gds2 + gds4 + gm4 + gs4 + Cgd2*f*pi*2i + Cgs4*f*pi*2i))^2) + (3301802341529731*A^2*gm1*abs(gm2 - pi*Cgd3*f*2i)^2*(Ga + Gb)^2*(gds3 + gm3 + gs3)^2*(gds4 + gm4 + gs4)^2)/(332306998946228968225951765070086144*abs(gds4*(gds3 - A*gm1 + A*Cgd1*f*pi*2i)*(gds3 + gm3 + gs3)*(gds4 + gm4 + gs4) - gds4*(Gref + gds3 + Cgd3*f*pi*2i)*(gds4 + gm4 + gs4)*(gds1 + gds3 + gm3 + gs3 + Cgd1*f*pi*2i + Cgs3*f*pi*2i) - (gds3 - A*gm1 + A*Cgd1*f*pi*2i)*(gds3 + gm3 + gs3)*(Ga + Gb + gds4 + Cgd4*f*pi*2i)*(gds2 + gds4 + gm4 + gs4 + Cgd2*f*pi*2i + Cgs4*f*pi*2i) + (Gref + gds3 + Cgd3*f*pi*2i)*(Ga + Gb + gds4 + Cgd4*f*pi*2i)*(gds1 + gds3 + gm3 + gs3 + Cgd1*f*pi*2i + Cgs3*f*pi*2i)*(gds2 + gds4 + gm4 + gs4 + Cgd2*f*pi*2i + Cgs4*f*pi*2i))^2) + (247635175614729825*gm4*abs(((gm4 + pi*Cgs4*f*2i)*(gds4 + gm4 + gs4) - (gm4 - pi*Cgd4*f*2i)*(gds2 + gds4 + gm4 + gs4 + pi*Cgd2*f*2i + pi*Cgs4*f*2i))*(- gds3*(gds3 + gm3 + gs3) + (Gref + gds3 + pi*Cgd3*f*2i)*(gds1 + gds3 + gm3 + gs3 + pi*Cgd1*f*2i + pi*Cgs3*f*2i) + A*(gm1 - pi*Cgd1*f*2i)*(gds3 + gm3 + gs3)))^2*(Ga + Gb)^2)/(83076749736557242056487941267521536*Cox4*L4*W4*f*abs(gds4*(gds3 - A*gm1 + A*Cgd1*f*pi*2i)*(gds3 + gm3 + gs3)*(gds4 + gm4 + gs4) - gds4*(Gref + gds3 + Cgd3*f*pi*2i)*(gds4 + gm4 + gs4)*(gds1 + gds3 + gm3 + gs3 + Cgd1*f*pi*2i + Cgs3*f*pi*2i) - (gds3 - A*gm1 + A*Cgd1*f*pi*2i)*(gds3 + gm3 + gs3)*(Ga + Gb + gds4 + Cgd4*f*pi*2i)*(gds2 + gds4 + gm4 + gs4 + Cgd2*f*pi*2i + Cgs4*f*pi*2i) + (Gref + gds3 + Cgd3*f*pi*2i)*(Ga + Gb + gds4 + Cgd4*f*pi*2i)*(gds1 + gds3 + gm3 + gs3 + Cgd1*f*pi*2i + Cgs3*f*pi*2i)*(gds2 + gds4 + gm4 + gs4 + Cgd2*f*pi*2i + Cgs4*f*pi*2i))^2) + (247635175614729825*gm2*abs(gm2 - pi*Cgd3*f*2i)^2*(Ga + Gb)^2*(gds4 + gm4 + gs4)^2)/(83076749736557242056487941267521536*Cox2*L2*W2*f*abs(gds4*gm4 + gds4*gs4 - (Ga + Gb + gds4 + Cgd4*f*pi*2i)*(gds2 + gds4 + gm4 + gs4 + Cgd2*f*pi*2i + Cgs4*f*pi*2i) + gds4^2)^2) + (247635175614729825*A^2*gm3*abs((gm2 - pi*Cgd3*f*2i)*((gm3 + pi*Cgs3*f*2i)*(gds3 + gm3 + gs3) - (gm3 - pi*Cgd3*f*2i)*(gds1 + gds3 + gm3 + gs3 + pi*Cgd1*f*2i + pi*Cgs3*f*2i)))^2*(Ga + Gb)^2*(gds4 + gm4 + gs4)^2)/(83076749736557242056487941267521536*Cox3*L3*W3*f*abs(gds4*(gds3 - A*gm1 + A*Cgd1*f*pi*2i)*(gds3 + gm3 + gs3)*(gds4 + gm4 + gs4) - gds4*(Gref + gds3 + Cgd3*f*pi*2i)*(gds4 + gm4 + gs4)*(gds1 + gds3 + gm3 + gs3 + Cgd1*f*pi*2i + Cgs3*f*pi*2i) - (gds3 - A*gm1 + A*Cgd1*f*pi*2i)*(gds3 + gm3 + gs3)*(Ga + Gb + gds4 + Cgd4*f*pi*2i)*(gds2 + gds4 + gm4 + gs4 + Cgd2*f*pi*2i + Cgs4*f*pi*2i) + (Gref + gds3 + Cgd3*f*pi*2i)*(Ga + Gb + gds4 + Cgd4*f*pi*2i)*(gds1 + gds3 + gm3 + gs3 + Cgd1*f*pi*2i + Cgs3*f*pi*2i)*(gds2 + gds4 + gm4 + gs4 + Cgd2*f*pi*2i + Cgs4*f*pi*2i))^2) + (247635175614729825*A^2*gm1*abs((gm1 - pi*Cgd1*f*2i)*(gm2 - pi*Cgd3*f*2i))^2*(Ga + Gb)^2*(gds3 + gm3 + gs3)^2*(gds4 + gm4 + gs4)^2)/(83076749736557242056487941267521536*Cox1*L1*W1*f*abs(gds4*(gds3 - A*gm1 + A*Cgd1*f*pi*2i)*(gds3 + gm3 + gs3)*(gds4 + gm4 + gs4) - gds4*(Gref + gds3 + Cgd3*f*pi*2i)*(gds4 + gm4 + gs4)*(gds1 + gds3 + gm3 + gs3 + Cgd1*f*pi*2i + Cgs3*f*pi*2i) - (gds3 - A*gm1 + A*Cgd1*f*pi*2i)*(gds3 + gm3 + gs3)*(Ga + Gb + gds4 + Cgd4*f*pi*2i)*(gds2 + gds4 + gm4 + gs4 + Cgd2*f*pi*2i + Cgs4*f*pi*2i) + (Gref + gds3 + Cgd3*f*pi*2i)*(Ga + Gb + gds4 + Cgd4*f*pi*2i)*(gds1 + gds3 + gm3 + gs3 + Cgd1*f*pi*2i + Cgs3*f*pi*2i)*(gds2 + gds4 + gm4 + gs4 + Cgd2*f*pi*2i + Cgs4*f*pi*2i))^2);
What I need is the integral of above's expression with respect to f over the interval 10 to 8000. The problem is that
Tn = int(Tn,f,10,8000)
never completes. Tn is a rational function in f and thus should have a closed solution. Afterwards, I want to convert the solution to a file using
matlabFunction(Tn,'File','Tn','Optimize',true)
I tried using
Tn = vpaintegral(Tn,f,10,8000)
instead but this produces non-executable code after converting it into a function file.
Are there better ways to do this?
  2 Comments
Torsten
Torsten on 22 Jan 2022
Yes, give numerical values to the constants, define
Tn=@(f) (your expression)
and solve the integral
result = integral(Tn,10,8000,'ArrayValued',true')
Dominik Hiltbrunner
Dominik Hiltbrunner on 22 Jan 2022
Tn=@(f) (your expression)
does not work for some reason when I edit the generated function files and add this line of code at the end.
However, using
Tn = matlabFunction(Tn) % Tn is only a function of f at this point
result = integral(fun,10,8000)
inside the generated function file works.

Sign in to comment.

Answers (0)

Categories

Find more on Special Functions in Help Center and File Exchange

Products


Release

R2020a

Community Treasure Hunt

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

Start Hunting!