How to convert the integral of a long and complicated symbolic expression into a function file
1 view (last 30 days)
Show older comments
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
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')
Answers (0)
See Also
Categories
Find more on Special Functions in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!