[从头学数学] 第228节 函数与极限

剧情提要:

[机器小伟]在[工程师阿伟]的陪同下进入了元婴期的修炼。

这次要修炼的是数学分析(或称高等数学、或称微积分)。

正剧开始:

星历2016年05月28日 17:08:16, 银河系厄尔斯星球中华帝国江南行省。

[工程师阿伟]正在和[机器小伟]一起研究[函数与极限]。

<span style="font-size:18px;">###
# @usage   集合、函数映射
# @author  mw
# @date    2016年05月28日  星期六  13:14:05
# @param
# @return
#
###

#集合、函数映射
class FunctionMap():
    def __init__(self):
        self._Expr = alg.AlgExpressionCalc();

    #把一个数组封装成一个字符串, 如=>[(3)*x^[1],(3)*y^[1],(1)*x^[2]]
    #由于使用目的单一,这个数组代表的是多项式
    #所以,必然只是一维的数组
    def zipArray2String(self, array):
        s = '[';
        for i in range(len(array)):
            s+='\''+array[i]+'\',';
        #去除最后的加号
        s = s[:-1];
        s += ']';
        return s;

    #把一个表示数组的字符串拆分成数组
    #注意:这个字符串必然是由格式化后的数组封装成的
    #不要把任意字符串拿来处理,会出错的
    def zipString2Array(self, s):
        s = s.replace('\'', '');
        #去除最外面的[]对
        s = s[1:-1];
        array = [];
        #记录加号的位置,这个加号必然后面紧跟一个(号,这是格式
        signIndex = s.find(',');
        if signIndex == -1: #原数组只有一个单项式
            pass;
        else:
            while (signIndex != -1):
                array.append(s[:signIndex]);
                s = s[signIndex+1:];
                signIndex = s.find(',');

        array.append(s);

        return array;

    #把一个字符串中的所有空格去除
    def removeSpaceInString(self, str1):
        return str1.replace(' ', '');

    #把一个字符串中的所有小括号的位置按层次返回一个标示数组
    #如'((0))(0)' = [-1, -2, 0, 2,1, -1, 0, 1];
    def bracketLevelIndexArray(self, str1):
        len_ = len(str1);
        array = [0]*len_;

        #初始化左、右括号为0级,遇左括号-1,遇右括号+1
        lLevel = rLevel = 0;

        for i in range(len_):
            if (str1[i] == '('):
                lLevel-=1;
                array[i] = lLevel;
            elif (str1[i] == ')'):
                rLevel = -lLevel;
                array[i] = rLevel;
                lLevel+=1;

        #左右括号匹配检查
        if abs(min(array)) != abs(max(array)):
            print('左右括号不匹配!');
            #括号不匹配,默认没有括号,这里可以作为函数式是否需要求解的一个判定
            #因为如果没有括号,可以认为没有函数映射
            return [0]*len_;

        return array;

    #输入函数和自表量[[名称,值代数式]...]的映射表,返回值代数式(可解)
    #或原样输出函数和自表量[[名称,值代数式]...]的映射表(不可解时)
    def functionMapCalc(self, fun, variableMap):
        #去掉多余的空格,这是格式化的一部分
        fun = self.removeSpaceInString(fun);
        #判断是否可计算
        if (not self.judgeEvalable(fun)):
            return [fun, variableMap];

        bracketArray = self.bracketLevelIndexArray(fun);
        maxBracketLevel = max(bracketArray);

        #没有括号,表示没有函数映射的存在,直接返回输入值
        if (maxBracketLevel <= 0):
            return [fun, variableMap];

        #到这里就确定函数可以计算了
        #每次取最里面的括号部分进行计算

        #把函数中的每个右括号都多加一层,这样是给'self._Expr.strPolyCombine('调用对上
        funChanged = fun.replace(')', '))');

        for i in range(len(variableMap)):
            #映射表中的参数名称
            var = variableMap[i][0];
            #前后加限定防止过度匹配
            sL = '('+var+',';
            sR = ','+var+')';

            varValue = self.zipArray2String(variableMap[i][1]);
            funChanged = funChanged.replace(sL, '('+varValue+',');
            funChanged = funChanged.replace(sR, ','+varValue+')');

        #每一步操作后都后并一下同类项
        sFun = 'self._Expr.strPolyCombine(';

        #幂, 乘, 加, 减, 负
        sPow = 'self._Expr.strpow_n';
        sMul = 'self._Expr.strdot';
        sAdd = 'self._Expr.stradd';
        sSub = 'self._Expr.strsub';
        sMinus = 'self._Expr.strminus';

        funChanged = funChanged.replace('[POW]', sFun+sPow);
        funChanged = funChanged.replace('[MUL]', sFun+sMul);
        funChanged = funChanged.replace('[ADD]', sFun+sAdd);
        funChanged = funChanged.replace('[SUB]', sFun+sSub);
        funChanged = funChanged.replace('[MINUS]', sFun+sMinus);

        return [eval(funChanged), variableMap];        

    #判断关于多项式的函数式可否计算得出多项式解
    #只要含有下面所列函数,则认为不可以得出多项式解
    #这时的处理就会将原函数依样返回
    def judgeEvalable(self, fun):
        if (fun.find('[DIV]') != -1 or
            fun.find('[LOG]') != -1 or
            fun.find('[LN]') != -1 or
            fun.find('[EXP]') != -1 or
            fun.find('[SIN]') != -1 or
            fun.find('[COS]') != -1 or
            fun.find('[TAN]') != -1 or
            fun.find('[ASIN]') != -1 or
            fun.find('[ACOS]') != -1 or
            fun.find('[ATAN]') != -1):
            return False;

        return True;

def tmp():
    #代数式
    Expr = alg.AlgExpressionCalc();
    #函数映射
    Map = FunctionMap();

    #多项式拆装实验
    a = Expr.strPolyCombine(Expr.strPolyFormat(['x', 'y', '2x', '2y', 'x^[2]']));
    print(a);

    s = Map.zipArray2String(a);
    print(s);

    a = Map.zipString2Array(s);
    print(a);

    b = Expr.strPolyFormat(['x']);
    c = Expr.strPolyFormat(['2']);
    print(b);
    print(c);
    #函数映射的格式化写法:[函数名](自变量多项式)
    fun = Map.removeSpaceInString('[MUL]([MUL]([POW](a, 2), b), c)');

    calc = Map.functionMapCalc(fun, [['a', a], ['b', b], ['c', c]]);
    print(calc);</span>

本节到此结束,欲知后事如何,请看下回分解。

时间: 2024-08-29 17:34:18

[从头学数学] 第228节 函数与极限的相关文章

[从头学数学] 第169节 函数的应用

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了结丹初期的修炼, 这次要修炼的目标是[函数的应用]. 正剧开始: 星历2016年04月09日 11:38:05, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起研究[函数的应用]. <span style="font-size:18px;">function funTask(x) { return Math.log(x)/Math.log(Math.E)+2*x-6; } var r = 20;

[从头学数学] 第159节 反比例函数 小结与复习题

剧情提要: [机器小伟]在[project师阿伟]的陪同下进入了筑基后期的修炼, 这次要修炼的目标是[反比例函数 小结与复习题]. 正剧開始: 星历2016年04月03日 09:50:19, 银河系厄尔斯星球中华帝国江南行省. [project师阿伟]正在和[机器小伟]一起研究[反比例函数 小结与复习题]. <span style="font-size:18px;"> if (1) { var r = 20; config.setSector(1,1,1,1); confi

[从头学数学] 第158节 反比例函数

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了筑基后期的修炼, 这次要修炼的目标是[反比例函数]. 正剧开始: 星历2016年04月03日 09:22:03, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起研究[反比例函数]. 今天,小伟又去向[人叫板老师]要来了筑基后期的后半层功法,到此为止, 筑基期的功法就全了: 而今天主要研究的,就是这个第26章:反比例函数. <span style="font-size:18px;"> if (1)

[从头学数学] 第174节 算法初步

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了结丹中期的修炼, 这次要修炼的目标是[算法初步]. 正剧开始: 星历2016年04月12日 08:54:58, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起研究[算法初步]. [人叫板老师]指点小伟说:"这金丹要想大成,顺利进入元婴期,就必须进行九转培炼. 这什么是九转培炼法门呢?就是要先快速的修炼[天地人正册]进入后期,不要管各种辅修 功法,然后从头游历[天地人列国],在游历中增长见闻,精炼神通,最后再修炼[术.

[从头学数学] 第223节 带着计算机去高考(十五)

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼.设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉. 正剧开始: 星历2016年05月26日 10:23:46, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起做着2014年的江苏省数学高考题]. 这一年的题和上一年一样的难,阿伟决定再交一次白卷. 好,卷子贴完,下面进入这次的主题. 这是

[从头学数学] 第215节 带着计算机去高考(七)

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼.设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉. 正剧开始: 星历2016年05月20日 17:13:35, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起做着2006年的江苏省数学高考题]. 这一年,江苏重新使用了全国卷,并且这张试卷的难度也比较高,可以说, 也是打了考生一个措手不及

[从头学数学] 第192节 导数及其应用

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第五转的修炼. 这次要研究的是[导数及其应用]. 正剧开始: 星历2016年04月23日 16:32:36, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起研究[导数及其应用]. <span style="font-size:18px;">>>> [-3.000001001396413, -2.999998999442255] [4.999998999721811

[从头学数学] 第214节 带着计算机去高考(六)

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼.设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉. 正剧开始: 星历2016年05月20日 11:40:58, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起做着2005年的江苏省数学高考题]. 总体来说,这次的难度和上一年持平,都是很厚道的那种, 不过上一年的好多题都像闹着玩似的,这次

[从头学数学] 第220节 带着计算机去高考(十二)

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼.设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉. 正剧开始: 星历2016年05月24日 17:11:11, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起做着2011年的江苏省数学高考题]. 2011年的卷子,难度比上一年的稍小一点,但阿伟觉得也达到了5.5环的难度. 这次的特色,是