Matlab 集成问题,输入函数问题
Matlab integration issue, issue with input function
我正在尝试对一个函数进行数值积分,这个函数在扩展和分析上绝对是可怕的。积分超过 dpsi 和 dtheta。如果我将变量存储为 sym,我被告知积分输入必须是双精度或单精度,如果我将其存储为双精度或单精度,我被告知我正在添加两个不同维度的张量。有帮助吗?
eta = input('Enter Dielectric Constant 1.5-4: ');
psi = input('Enter Lattitude -pi/2 to +pi/2: ');
theta = input('Enter Longitude -pi/2 to +pi/2: ');
sdev = input('Enter STD DEV (roughness) maybe 0.1: ');
dpsi = sym('dspi');
dtheta = sym('dtheta');
calpha = (cos(theta+dtheta)).*(cos(psi+dpsi));
rp01 = calpha-sqrt(eta-1+((calpha).^2));
rp02 = calpha+sqrt(eta-1+((calpha).^2));
rperp = (rp01./rp02).^2;
rp11 = ((eta.*calpha)-sqrt(eta-1+((calpha).^2)));
rp12 = ((eta.*calpha)+sqrt(eta-1+((calpha).^2)));
rpar = (rp11./rp12).^2;
fun = @(dtheta,dpsi) (rpar+rperp)
thetamax = (pi/2) - theta
psimax = (pi/2) - psi
q = integral2(fun,-pi/2,thetamax,-pi/2,psimax)
最简单的解决方案:
使用以下方法将符号表达式转换为实际数值函数:
fun = matlabFunction((rpar+rperp),'vars',{dtheta,dpsi});
更好的解决方案:
首先避免符号化的东西,只定义一个函数:
function out = YOURFANCYFUNCTION(eta,psi,theta,sdev,dtheta,dpsi)
calpha = (cos(theta+dtheta)).*(cos(psi+dpsi));
rp01 = calpha-sqrt(eta-1+((calpha).^2));
rp02 = calpha+sqrt(eta-1+((calpha).^2));
rperp = (rp01./rp02).^2;
rp11 = ((eta.*calpha)-sqrt(eta-1+((calpha).^2)));
rp12 = ((eta.*calpha)+sqrt(eta-1+((calpha).^2)));
rpar = (rp11./rp12).^2;
out = (rpar+rperp);
您传递给 integral 的函数应该是:
fun = @(dtheta,dpsi) YOURFANCYFUNCTION(eta,psi,theta,sdev,dtheta,dpsi)
它捕获 eta,psi,theta,sdev
的当前值并生成 dtheta
和 dpsi
变量。
顺便说一句:从未使用过变量 sdev
。
我正在尝试对一个函数进行数值积分,这个函数在扩展和分析上绝对是可怕的。积分超过 dpsi 和 dtheta。如果我将变量存储为 sym,我被告知积分输入必须是双精度或单精度,如果我将其存储为双精度或单精度,我被告知我正在添加两个不同维度的张量。有帮助吗?
eta = input('Enter Dielectric Constant 1.5-4: ');
psi = input('Enter Lattitude -pi/2 to +pi/2: ');
theta = input('Enter Longitude -pi/2 to +pi/2: ');
sdev = input('Enter STD DEV (roughness) maybe 0.1: ');
dpsi = sym('dspi');
dtheta = sym('dtheta');
calpha = (cos(theta+dtheta)).*(cos(psi+dpsi));
rp01 = calpha-sqrt(eta-1+((calpha).^2));
rp02 = calpha+sqrt(eta-1+((calpha).^2));
rperp = (rp01./rp02).^2;
rp11 = ((eta.*calpha)-sqrt(eta-1+((calpha).^2)));
rp12 = ((eta.*calpha)+sqrt(eta-1+((calpha).^2)));
rpar = (rp11./rp12).^2;
fun = @(dtheta,dpsi) (rpar+rperp)
thetamax = (pi/2) - theta
psimax = (pi/2) - psi
q = integral2(fun,-pi/2,thetamax,-pi/2,psimax)
最简单的解决方案:
使用以下方法将符号表达式转换为实际数值函数:
fun = matlabFunction((rpar+rperp),'vars',{dtheta,dpsi});
更好的解决方案:
首先避免符号化的东西,只定义一个函数:
function out = YOURFANCYFUNCTION(eta,psi,theta,sdev,dtheta,dpsi)
calpha = (cos(theta+dtheta)).*(cos(psi+dpsi));
rp01 = calpha-sqrt(eta-1+((calpha).^2));
rp02 = calpha+sqrt(eta-1+((calpha).^2));
rperp = (rp01./rp02).^2;
rp11 = ((eta.*calpha)-sqrt(eta-1+((calpha).^2)));
rp12 = ((eta.*calpha)+sqrt(eta-1+((calpha).^2)));
rpar = (rp11./rp12).^2;
out = (rpar+rperp);
您传递给 integral 的函数应该是:
fun = @(dtheta,dpsi) YOURFANCYFUNCTION(eta,psi,theta,sdev,dtheta,dpsi)
它捕获 eta,psi,theta,sdev
的当前值并生成 dtheta
和 dpsi
变量。
顺便说一句:从未使用过变量 sdev
。