求导

第一单元总结

混江龙づ霸主 提交于 2020-03-20 23:27:51
我觉得自己并没有很好地把求导的过程拆解开,我的确也根据几种函数的类型分出了几个类,并对他们分别设置了方法。 但是由于我试图一边进行求导,一边进行字符串的分析,导致了大量的代码堆积在了一个方法中,我现在回头看这些代码真是又臭又长,很难进行维护。 有几个bug也都是因为这个原因导致我无法找到bug的产生的具体原因。 反思总结一下,我需要把过程进行进一步的拆解。就字符串解析这一个过程,我就应该分成几个方法,一步步地解析,而不是用一堆分支语句。 其次,求导前后的结构应该统一起来。否则迭代起来容易把自己绕晕。 关于挑bug,可以把一些边缘的测试样例都试一遍,把他们都记录下来,每个对应哪个易错点,方便进行系统化的测试。 对比一下别的同学每个类的功能非常明确,我的类的功能还是太复杂了,可以进一步简化。 来源: https://www.cnblogs.com/split-/p/12535576.html

NO OO NO LIFE:OO第一单元总结

一笑奈何 提交于 2020-03-19 14:42:32
目录 第一次作业 第二次作业 第三次作业 总结 体会 第一次作业 作业分析 本次作业任务: 简单多项式导函数的求解 。 经历第一单元的 摧残 洗礼之后,再来看第一次作业的要求确实很水。由于表达式中只存在幂函数且每一项遵循 a*x**b 的格式,同时也不用考虑 WRONG FORMAT! 的情况,我们的工作就显得十分轻松了。 去除多余的空白符,并且整理多余的加减号。 使用 正则 解析表达式,并且创建实例化对象。 根据求导规则进行求导。 优化求导之后得到的表达式,输出。 其中对于输出表达式的优化策略主要包括以下: 处理系数1、-1,处理指数0、1。 合并同类项。 根据系数大小排序,保证正数在前。 UML图 本次作业,为保证后续的迭代工作,建立了Item抽象类,并设立了求导抽象方法。但是由于对后续迭代的情况考虑不周,第二次作业还是选择了 重构 。 度量分析 Method ev(G) iv(G) V(G) Item.checkItem(Item,ArrayList ) 4 5 6 Item.fervation() 1 1 1 Item.getCoef() 1 1 1 Item.getIndex() 1 1 1 Item.getItem(String,ArrayList ) 1 1 1 Item.setCoef(BigInteger) 1 1 1 Item.setIndex

OO第一单元作业总结

喜你入骨 提交于 2020-03-19 13:24:41
第一单元小结 基于度量分析自己的程序结构(工具:DesigniteJava、MetricsReloader) 总的分析:unit1的作业的代码的质量不是很高,主要有以下几点原因: 类与类之间耦合程度过高,可扩展性差 部分类内部实现过于复杂,不利于调试和维护 没有使用对象构造中的工厂模式进行因子、项等的创建 部分类内部方法的实现不够聚合,会与其他类的一些方法有较大联系 圈复杂度:和类内部实现的复杂度相关,循环条件判断等复杂的逻辑组合相关 类之间的依赖关系 UML图如下: 分析:在这次的设计过程中,类的划分上是存在一定的问题的,例如对于不同因子的求导的过程,求导应该交给对应的类自己去完成,在内部实现求导功能,返回一个统一的类型,而不是交由外部进行判断然后求出求出对应的结果,因此应当在之后的设计中尽可能降低类与类之间的耦合程度,增加类内部的聚合度,从而实现功能的专一性(职责明确),DIT为1。 优点:使用到了类的继承的设计结构,抽象方法的复写 缺点:方法的功能上不是很专一,方法与方法之间的耦合度比较高,有些方法的实现过于复杂,不便于调试和维护 Metrics分析: 分析:在这一单元的构造中,部分的代码架构不是很好,不太容易维护,其中最主要的原因是大量的使用到了if-else的逻辑判断的语句,同时存在者多层的嵌套结构,导致代码的可维护性和可扩展性大大降低; 解决的办法

面向对象设计入门一:表达式求导

时光怂恿深爱的人放手 提交于 2020-03-18 22:46:49
一.多项式求导 (一)对象和方法设计 根据定义,多项式是由若干符号和项交替组成。和求导规则决定多项式求导等价对每个项求导。因此考虑一个项类,包含两个Biginteger类型数据次幂和系数,对应幂指数求导方法,toString()方法。为了化简,提供一个判断是否系数是负数的布尔值方法来判断表达式这一项前是否需要‘+’。表达式本质上转化为项的集合,为化简则选用不可重复集合。 在主类中,按照工作流程分别设置静态方法输入分析,表达式求导和静态输出。保证输入正确性降低了鲁棒性要求,处理合法空白字符后直接使用正则表达式读取符号和表达式项组合,进而获得一个项类。表达式求导和静态求导就是遍历。 (二)对比作业程序和结果 在对象上,并没有考虑项类,而是直接考虑了Hashmap的不可重复Biginteger组,优点是省事、简单粗暴。缺点是丧失面向对象的结构特征,使得所有代码都在主类中且都是静态方法。像极了面向函数编程。 HashMap<BigInteger,BigInteger> polyContent = new HashMap<>(); 输入处理上,首先是采用了大正则的形式,关键是忘记去空格预处理,用捕获组提取项。 Pattern p = Pattern.compile("\\s*([+-]\\s*)?((([+-]?\\d+\\s*\\*\\s*|[+-]\\s*)?x(\\s*\\*\\*\

2020北航OO表达式求导作业总结

我的未来我决定 提交于 2020-03-18 22:40:21
三次作业的思路与bug测试 第一次作业 ​ 第一次作业内容为简多项式单导函数的求解,项包含常数项(带符号整数)与变量项(系数与幂函数的乘积),表达式由加法和减法运算符连接若干项组成。且输入中确保格式的正确性。 1.1 实现方案 根据需求,我们很容易联想到用 HashMap 表示每一项中幂函数指数与系数的对应关系。而且因为这是第一次作业,我没有考虑可扩展性,直接在多项式类 Ploy 中使用了类型为 HashMap<BigInteger,BigInteger> 的 ploy 作为存储的数据结构。 数据层次:根据指导书表述,容易联想到建立指数与系数的 HashMap 来表示多项式,我建立了多项式类 Ploy ,项类 Term ,主类 MainClass 。 输入解析:我采用了按项拆分字符串的方法,提取过程中应用了正则表达式。 三次作业包你掌握正则表达式(●'◡'●) 求导功能:我在Ploy类中实现了 diffPloy() 方法,该方法会返回一个求导后的导函数,即一个新的Ploy对象。 输出:我在Ploy类中实现了 printFirst() 方法。 优化方面:实现了合并同类项、正项先输出、零项不输出、系数为1或-1时省略。 ①在 MainClass 里实例化 Ploy 对象 ploy,借用正则表达式将输入的字符串拆为单项的字符串,将拆好的字符串扔进 Term

OO第一次博客作业

前提是你 提交于 2020-03-18 17:02:36
面向对象程序设计第一单元博客作业 程序结构分析 第一次作业 第一次作业较为简单,根据 多项式由多个项构成 的描述,可以抽象出两个类——多项式、项。多项式的求导结果便是其各个项的求导结果之和。 项类持有两个 BigInteger 对象(项的系数和指数)。项类实现 Comparable 接口,从而可以根据两个项的比较结果判定两个项是否为同类项(可合并)。项类配备求导方法,返回一个新的项。 多项式类持有一个 List 对象,存储其各个项。多项式类配备求导方法,返回一个新的多项式。 第一次作业读入处理:使用正则表达式直接提取各个项。 类图: 代码行数: 方法复杂度: 第二次作业 第二次作业出现了三角函数因子,理论上可以抽象出因子类的概念,但考虑到第二次作业存在优化问题,以及一个项的一般形式可以表示为 a*x**b*sin(x)**c*cos(x)**d ,故使用一个四元组来构成一个项。考虑到两个项是否可合并取决于两个项的指数部分是否对应相等,故将指数部分封装成类,覆写其 hashCode 与 equals 方法。 项类持有一个 BigInteger 对象(项的系数)和一个指数类对象。项类配备求导方法,返回一个项表。 表达式类持有一个 HashMap 对象,以指数类对象为键,以持有此指数类对象的项类对象为值,实现读入项合并。表达式类配备求导方法,返回一个表达式。 第二次作业读入处理

BUAA_OO_Summary_StageOne

拜拜、爱过 提交于 2020-03-18 00:21:56
一、程序结构分析 第一次作业 思路: 本次作业比较简单,只有幂函数求导,并且不支持连乘,用了一个Mono类,Poly类,一个主类就解决了战斗 Mono类主要存系数和指数 Poly类用HashMap存储每个幂函数的系数和指数,并且在Poly类中实现了求导 在主类中实现了数据的读入和处理,用大正则直接莽的 分析总结: 第一次作业还不太能应用面向对象的思维,也没有太考虑到扩展性,导致第二次直接重构 附上第一次作业UML图,由于构思的不好,显得就像面向过程 附上各类的的复杂度分析 有 OCavg 和 WMC 两个项目,分别代表类的方法的平均循环复杂度和总循环复杂度。 第二次作业 思路: 作业二因子中加入了三角函数,并且在单项式中支持因子连乘, 也许已经稍微有一点摸到面向对象的边缘了 。 设计处理输入类RegExp和StringProcess。RegExp中主要是分级并返回各级正则表达式,StringProcess中利用正则表达式进行字符串的分解和读取。 并且由于本次要判断字符串是否合法,不合法输出"WRONG FORMAT!",因此我自定义了一个异常类来解决,继承自Exception。 在RegExp中返回了一个整个多项式的正则表达式,如果匹配出来的长度和输入不相等则抛出一个自定义的异常(输入为空也抛出)。 考虑到第一次作业可扩展性不足,这次经过理性分析后,设计了抽象类Factor

基础实验3-2.1 一元多项式求导 (20分)

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-15 19:22:11
设计函数求一元多项式的导数。 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。 输入样例: 3 4 -5 2 6 1 -2 0 输出样例: 12 3 -10 1 6 0 #include<iostream> using namespace std; int main() { int n, e, flag = 0;//依次为系数,指数和标志 while(scanf("%d%d",&n,&e)==2)//只要正确读入n 和 e,就进入循环 { if(n*e) { if(flag) printf(" "); else//flag是标识符 flag =1;//第一次进入循环时不打出空格,第二次循环开始要:空格+数值;的格式输出 printf("%d %d",n*e,e-1); } } if(!flag)//处理0式 printf("0 0"); return 0; } //来自牛客网,非我能想出的巧妙解题方法 来源: https://www.cnblogs.com/qinmin/p/12499218.html

1010 一元多项式求导

こ雲淡風輕ζ 提交于 2020-03-08 13:02:03
题目: 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。 输出格式: 以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。 输入样例: 3 4 -5 2 6 1 -2 0 输出样例: 12 3 -10 1 6 0 # include <cstdio> int main ( ) { int c , t , flag = 0 , i = 0 ; while ( scanf ( "%d%d" , & c , & t ) == 2 ) { i ++ ; if ( flag == 1 && t != 0 ) printf ( " " ) ; if ( t != 0 ) printf ( "%d %d" , c * t , t - 1 ) ; flag = 1 ; } if ( i == 1 ) printf ( "0 0" ) ; return 0 ; } 来源: CSDN 作者: Lxp_javaer 链接: https://blog.csdn.net/weixin_43490369/article/details/104728397

Pytorch中使用backward()求导详解

谁都会走 提交于 2020-03-06 16:05:37
backward()是Pytorch中用来求梯度的方法,可以分为三种情况来使用。 1.out.backwark()中out是一个标量 此时可以直接使用out.backwark(): import torch from torch . autograd import Variable #生成一个内容为[2,3]的张量,Varibale 默认是不要求梯度的,如果要求梯度, #需要加上requires_grad=True来说明 #这里的Variable是为了设置变量,把a0=2,a1=3设置为两个变量 a = Variable ( torch . tensor ( [ 2 , 3 ] ) , requires_grad = True ) b = a + 3 c = b * 3 out = c . mean ( ) #求均值 out . backward ( ) print ( "a=" , a ) print ( "out=" , out ) print ( a . grad ) #求out对a的偏导 结果为 a = tensor ( [ 2 . , 3 . ] , requires_grad = True ) out = tensor ( 16.5000 , grad_fn = < MeanBackward0 > ) tensor ( [ 1.5000 , 1.5000 ] )