四元函数在循环中工作而不调用文件

时间:2013-12-19 16:22:31

标签: matlab loops integration quad

我需要使用quad方法集成到循环中。我不能创建和外​​部文件并调用它,因为积分方程中的变量随循环而不断变化,所以我为了简化而切割循环。它给了我一个quad方法行的错误 - 不知道如何解决它 - 确切地说KrInitialIntegratedPart 我收到的错误消息是:

使用内联/子参数时出错(第13行) 没有足够的内联函数输入。

quad中的错误(第68行) y = f(x,varargin {:});

newproj4出错(第39行)         KrInitialIntegratedPart = quad('(sin(x))(exp(-Aititial / aInitial))(db)',0,         FE)

    clear all;
clc;
%% All the constants and initial conditions

% the position conponents are "r" and "z"
% the velocity conponents are "vr" and "vz"

% the initial position components
rInitial= 10; %kpc
zInitial= 0; %kpc
% the initial velocity components
vrInitial= 0; %km/s
vzInitial= 150; %tangential velocity component
vtInitial= 150; %not used
% the height
h= rInitial*vzInitial; %angulan momentum constant
tInitial=0;
Dt=1e-3;
%ThetaiPlus1= Thetai + ( ( Dt*h ) / ( riPlus1Over2^2 ) );

%% The for loop

    % the position components
    riPlus1Over2= rInitial + 0.5*Dt*vrInitial;
    ziPlus1Over2= zInitial + 0.5*Dt*vzInitial;

    % integrating to solve for the acceleration components
    % needed for the integration
    b=0;
    e=0.99;
    pc=11613.5;
    AInitial= (1/e)*sqrt( ( rInitial^2*( sin(0) )^2 ) + ( zInitial^2*( tan(0) )^2 ) );
    aInitial=2.8;
    fe=asind(e); % the upper limit of th integral
    db= fe / 20; %4.094519277200290

    % solving for the accleration compoenet in the r diection
    KrInitialIntegratedPart= quad('(sin(x))*(exp(-AInitial/aInitial))*(db)', 0, fe)
    KrInitialFirstPart= -4*pi*pc*sqrt( 1-(e^2) / (e^3) )*rInitial;
    KrInitial= KrInitialFirstPart*KrInitialIntegratedPart;

1 个答案:

答案 0 :(得分:1)

通过文件你的意思是一个单独的M文件定义要集成的功能?无论如何,这是使用quad和正交积分函数的老式方法。你不应该传递字符串而是function handles。假设x是集成变量,您可以使用:

KrInitialIntegratedPart = quad(@(x)sin(x)*exp(-AInitial/aInitial)*db, 0, fe);

参数AInitialaInitialdb将由其在代码中的当前值确定。 (此外,您不需要使用这么多括号 - 这会使代码更难阅读。)

如果您在单独的M文件或子函数中编写集成函数,您仍应使用函数句柄。在这种情况下,您可以调用该函数并通过创建anonymous function来传递参数:

KrInitialIntegratedPart = quad(@(x)MyFunName(x, AInitial, aInitial,db), 0, fe);

根据您使用的Matlab版本,您可以尝试使用integral(或quadgk,如果您没有)。