Project1

标题: 复数脚本 V1.9 修正log10、log bug 新增unpolar [打印本页]

作者: 3535    时间: 2008-5-31 07:03
标题: 复数脚本 V1.9 修正log10、log bug 新增unpolar
修正log10、log bug
只经过初步测试…指数只能整数…- -

方法
[LINE]1,#dddddd[/LINE]
self + other
self - other
self * other
self / other  
self ** other
算术运算符。分别表示和(加)、差(减)、积(乘)、商(除)、幂(乘方)。
self == other
判断相等。
abs
绝对值。
polar
极式。
unploar
a = Complex(1,2).polar
p Complex(a[0],a[1]).unpolar # => Complex(1,2)

Math:
csc
sec
cot
sincostan的倒数。
qu
二次方程
fact
阶乘。
cbrt
立方根。
to_rad
度数转弧度。
to_deg
弧度转度数。
nCr
…这东西中文叫?
sqrt
exp
log
log10
sin
cos
tan
sinh
cosh
tanh
asin
acos
atan
asinh
acosh
atanh
扩展复数运算。

Object:
Complex(re,im)
建立一个复数。

Numeric:
to_c

  1. class Complex
  2.   attr(:re)
  3.   attr(:im)
  4.   def initialize(re, im)
  5.     @re = re
  6.     @im = im
  7.   end
  8.   def +(other)
  9.     if other.class == Complex
  10.       return Complex(@re+other.re, @im+other.im)
  11.     else
  12.       return Complex(@re+other, @im)
  13.     end
  14.   end
  15.   def -(other)
  16.     if other.class == Complex
  17.       return Complex(@re-other.re, @im-other.im)
  18.     else
  19.       return Complex(@re-other, @im)
  20.     end
  21.   end
  22.   def *(other)
  23.     if other.class == Complex
  24.       return Complex(@re*other.re-@im*other.im, @im*other.re+@re*other.im)
  25.     else
  26.       return Complex(@re*other, @im*other)
  27.     end
  28.   end
  29.   def /(other)
  30.     if other.class == Complex
  31.       a = (@re*other.re+@im*other.im)/(other.re**2+other.im**2)
  32.       b = (@im*other.re-@re*other.im)/(other.re**2+other.im**2)
  33.       return Complex(a, b)
  34.     else
  35.       return Complex(@re/other, @im/other)
  36.     end
  37.   end
  38.   def **(other)
  39.     times = other
  40.     if @im == 0
  41.       return @re**other
  42.     else
  43.       if times >= 2
  44.         result = self*self
  45.         times -= 2
  46.         result**times
  47.       end
  48.       return result
  49.     end
  50.   end
  51.   def ==(other)
  52.     a = @re == other.re
  53.     b = @im == other.im
  54.     if a == true and b == true
  55.       return ture
  56.     else
  57.       return false
  58.     end
  59.   end
  60.   def abs
  61.     return Math.sqrt(@re**2+@im**2)
  62.   end
  63.   def polar
  64.     z = Math.sqrt(@re**2 + @im ** 2)
  65.     theta = Math.atan(Float(@im)/Float(@re))
  66.     return z, theta
  67.   end
  68.   def unpolar
  69.     r = @re
  70.     theta = @im
  71.     return Complex(r*Math.cos(theta), r*Math.sin(theta))
  72.   end
  73.   def coerce(numeric)
  74.     if numeric.class != Complex
  75.       return numeric.to_c, self
  76.     end
  77.   end
  78.   def +@
  79.     return self
  80.   end
  81.   def -@
  82.     return Complex(-@re,-@im)
  83.   end
  84. end
  85. class Object
  86.   def Complex(re,lm)
  87.     return Complex.new(re,lm)
  88.   end
  89. end
  90. class Numeric
  91.   def to_c
  92.     return Complex(self, 0)
  93.   end
  94. end
  95. #==============================================================================
  96. # ■ Math
  97. #------------------------------------------------------------------------------
  98. #  支持浮点运算的模块。
  99. #==============================================================================

  100. module Math
  101.   #--------------------------------------------------------------------------
  102.   # ● 恒量
  103.   #--------------------------------------------------------------------------
  104.   I = Complex(0,1)
  105.   #--------------------------------------------------------------------------
  106.   # ● Csc
  107.   #--------------------------------------------------------------------------
  108.   def self.csc(x)
  109.     return 1/self.sin(x)
  110.   end
  111.   #--------------------------------------------------------------------------
  112.   # ● Sec
  113.   #--------------------------------------------------------------------------
  114.   def self.sec(x)
  115.     return 1/self.cos(x)
  116.   end
  117.   #--------------------------------------------------------------------------
  118.   # ● Cot
  119.   #--------------------------------------------------------------------------
  120.   def self.cot(x)
  121.     return 1/self.tan(x)
  122.   end
  123.   #--------------------------------------------------------------------------
  124.   # ● 二次方程一
  125.   #--------------------------------------------------------------------------
  126.   def self.qu(a, b, c)
  127.     y1 = (-1*b + self.sqrt(b*b - 4*a*c)) / 2*a
  128.     y2 = (-1*b - self.sqrt(b*b - 4*a*c)) / 2*a
  129.     if y1 == y2
  130.       return y1
  131.     else
  132.       return y1,y2
  133.     end
  134.   end
  135.   #--------------------------------------------------------------------------
  136.   # ● 阶乘
  137.   #--------------------------------------------------------------------------
  138.   def self.fact(numb)
  139.     if numb == 0
  140.       return 1
  141.     end
  142.     if numb.is_a?(Integer)
  143.       for i in 1...numb
  144.         numb *=  i
  145.       end
  146.       return numb
  147.     else
  148.       result = self.sqrt(2*PI*numb) * (numb/E)**numb * (1+1/12*numb+1/288*numb**2-139/51840*numb**3-571/2488320*numb**4)
  149.       return result
  150.     end
  151.   end
  152.   #--------------------------------------------------------------------------
  153.   # ● 立方根
  154.   #--------------------------------------------------------------------------
  155.   def self.cbrt(x)
  156.     return self.exp(self.log(x)/3)
  157.   end
  158.   #--------------------------------------------------------------------------
  159.   # ● 度数转弧度
  160.   #--------------------------------------------------------------------------
  161.   def self.to_rad(x)
  162.     r = x*(PI/180)
  163.     return r
  164.   end
  165.   #--------------------------------------------------------------------------
  166.   # ● 弧度转度数
  167.   #--------------------------------------------------------------------------
  168.   def self.to_deg(x)
  169.     d = x*(180/PI)
  170.     return d
  171.   end
  172.   #--------------------------------------------------------------------------
  173.   # ● nCr
  174.   #--------------------------------------------------------------------------
  175.   def self.nCr(n, r)
  176.     return (self.fact(n))/(self.fact(r)*self.fact(n-r))
  177.   end
  178. end
  179. #==============================================================================
  180. # ■ Math
  181. #------------------------------------------------------------------------------
  182. #  扩展复数运算。
  183. #==============================================================================
  184. class << Math
  185.   alias old_sqrt sqrt
  186.   alias old_exp exp
  187.   alias old_log log
  188.   alias old_log10 log10
  189.   alias old_sin sin
  190.   alias old_cos cos
  191.   alias old_tan tan
  192.   alias old_sinh sinh
  193.   alias old_cosh cosh
  194.   alias old_tanh tanh
  195.   alias old_asin asin
  196.   alias old_acos acos
  197.   alias old_atan atan
  198.   alias old_asinh asinh
  199.   alias old_acosh acosh
  200.   alias old_atanh atanh
  201.   #--------------------------------------------------------------------------
  202.   # ● 平方根
  203.   #--------------------------------------------------------------------------
  204.   def sqrt(z)
  205.     if z.class == Complex
  206.       r = z.abs
  207.       x = z.re
  208.       return Complex(old_sqrt((r + x) / 2), old_sqrt((r - x) / 2))
  209.     else
  210.       if z < 0
  211.         return Complex.new(0, old_sqrt(z.abs))
  212.       else
  213.         old_sqrt(z)
  214.       end
  215.     end
  216.   end
  217.   #--------------------------------------------------------------------------
  218.   # ● 指数函数
  219.   #--------------------------------------------------------------------------
  220.   def exp(z)
  221.     if z.class == Complex
  222.       return Complex(old_exp(z.re) * old_cos(z.im), old_exp(z.re) * old_sin(z.im))
  223.     else
  224.       old_exp(z)
  225.     end
  226.   end
  227.   #--------------------------------------------------------------------------
  228.   # ● 自然对数
  229.   #--------------------------------------------------------------------------
  230.   def log(z)
  231.     if z.class == Complex
  232.       return Complex(old_log(z.abs), z.polar[1])
  233.     else
  234.       if z < 0
  235.         return Complex(log(z.abs), Math::PI)
  236.       else
  237.         old_log(z)
  238.       end
  239.     end
  240.   end
  241.   #--------------------------------------------------------------------------
  242.   # ● 常用对数
  243.   #--------------------------------------------------------------------------
  244.   def log10(z)
  245.     if z.class == Complex
  246.       u = Complex(old_log10(z.abs), z.polar[1]/old_log(10))
  247.       return u
  248.     else
  249.       if z < 0
  250.         return Complex(old_log10(z.abs), old_log10(Math::E)*Math::PI)
  251.       else
  252.         old_log10(z)
  253.       end
  254.     end
  255.   end
  256.   #--------------------------------------------------------------------------
  257.   # ● sin
  258.   #--------------------------------------------------------------------------
  259.   def sin(z)
  260.     if z.class == Complex
  261.       return Complex(old_sin(z.re) * old_cosh(z.im), old_cos(z.re) * old_sinh(z.im))
  262.     else
  263.       old_sin(z)
  264.     end
  265.   end
  266.   #--------------------------------------------------------------------------
  267.   # ● cos
  268.   #--------------------------------------------------------------------------
  269.   def cos(z)
  270.     if z.class == Complex
  271.       return Complex(old_cos(z.re) * old_cosh(z.im), -old_sin(z.re) * old_sinh(z.im))
  272.     else
  273.       old_cos(z)
  274.     end
  275.   end
  276.   #--------------------------------------------------------------------------
  277.   # ● tan
  278.   #--------------------------------------------------------------------------
  279.   def tan(z)
  280.     if z.class == Complex
  281.       return sin(z)/cos(z)
  282.     else
  283.       old_tan(z)
  284.     end
  285.   end
  286.   #--------------------------------------------------------------------------
  287.   # ● sinh
  288.   #--------------------------------------------------------------------------
  289.   def sinh(z)
  290.     if z.class == Complex
  291.       return Complex(old_sinh(z.re) * old_cos(z.im), old_cosh(z.re) * old_sin(z.im))
  292.     else
  293.       old_sinh(z)
  294.     end
  295.   end
  296.   #--------------------------------------------------------------------------
  297.   # ● cosh
  298.   #--------------------------------------------------------------------------
  299.   def cosh(z)
  300.     if z.class == Complex
  301.       return Complex(old_cosh(z.re) * old_cos(z.im), old_sinh(z.re) * old_sin(z.im))
  302.     else
  303.       old_cosh(z)
  304.     end
  305.   end
  306.   #--------------------------------------------------------------------------
  307.   # ● tanh
  308.   #--------------------------------------------------------------------------
  309.   def tanh(z)
  310.     if z.class == Complex
  311.       return sinh(z) / cosh(z)
  312.     else
  313.       old_tanh(z)
  314.     end
  315.   end
  316.   #--------------------------------------------------------------------------
  317.   # ● asin
  318.   #--------------------------------------------------------------------------
  319.   def asin(z)
  320.     if z.class == Complex
  321.       return log(Math::I * z + sqrt(1.0 - z * z))/Math::I
  322.     else
  323.       old_asin(z)
  324.     end
  325.   end
  326.   #--------------------------------------------------------------------------
  327.   # ● acos
  328.   #--------------------------------------------------------------------------
  329.   def acos(z)
  330.     if z.class == Complex
  331.       return log(z + Math::I * sqrt(1.0 - z * z))/Math::I
  332.     else
  333.       old_acos(z)
  334.     end
  335.   end
  336.   #--------------------------------------------------------------------------
  337.   # ● atan
  338.   #--------------------------------------------------------------------------
  339.   def atan(z)
  340.     if z.class == Complex
  341.       return log((1.0 + z * Math::I)/(1.0 - z * Math::I))/Math::I*2
  342.     else
  343.       old_atan(z)
  344.     end
  345.   end
  346.   #--------------------------------------------------------------------------
  347.   # ● asinh
  348.   #--------------------------------------------------------------------------
  349.   def asinh(z)
  350.     if z.class == Complex
  351.       return log(z + sqrt(1.0 + z * z))
  352.     else
  353.       old_asinh(z)
  354.     end
  355.   end
  356.   #--------------------------------------------------------------------------
  357.   # ● acosh
  358.   #--------------------------------------------------------------------------
  359.   def acosh(z)
  360.     if z.class == Complex
  361.       return log(z + sqrt(z * z - 1.0))
  362.     else
  363.       old_acosh(z)
  364.     end
  365.   end
  366.   #--------------------------------------------------------------------------
  367.   # ● atanh
  368.   #--------------------------------------------------------------------------
  369.   def atanh(z)
  370.     if z.class == Complex
  371.       return log((1.0 + z) / (1.0 - z)) / 2.0
  372.     else
  373.       old_atanh(z)
  374.     end
  375.   end
  376. end
复制代码

作者: 禾西    时间: 2008-5-31 07:05
甚麽叫複數...英文是甚麽 Orz
(完全看不懂題目與腳本的人爬過)
作者: Infrared    时间: 2008-5-31 07:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-5-31 07:33
哦哦,原來是complex num...我說中文怎麼叫複數 Orz。
麻煩在開頭提及所有新增的公共方法和私有方法
作者: Infrared    时间: 2008-5-31 07:43
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-5-31 08:09
Orz 禾西錯了...提問區多謝有你們在幫忙...
作者: Infrared    时间: 2008-5-31 08:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: Infrared    时间: 2008-6-1 00:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: Infrared    时间: 2008-6-1 02:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: Elegance    时间: 2008-6-1 04:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: Infrared    时间: 2008-6-1 08:09
提示: 作者被禁止或删除 内容自动屏蔽
作者: asperta    时间: 2008-6-1 08:20
不知这个脚本有什么用!

话说LZ高一?
作者: hitlerson    时间: 2008-6-1 08:25
可以帮助中学数学老师做 数学应用题~~~
作者: Infrared    时间: 2008-6-1 08:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: link006007    时间: 2008-6-1 09:07
以下引用Elegance于2008-5-31 20:03:32的发言:

新增复数反三角函数。- -

难道是太垃圾了,所以没人回复…- -

不是垃圾   只是很少人会对一个没有外在表现力的功能库感兴趣
就算哪一天我写了一个RM2D用的向量库, 说不定更凄惨

与ruby标准库中的复数... 你写的已经很接近了
只不过它抛的异常情况考虑的比你多

作者: 禾西    时间: 2008-6-1 10:16
連帖,Kill 飛自己
作者: 禾西    时间: 2008-6-1 14:48
發布...
3535.VIP += 3
有更新PM 我
作者: Stifling    时间: 2008-6-1 22:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-6-27 21:53
更新完畢
作者: Infrared    时间: 2009-6-12 08:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: zh99998    时间: 2009-8-13 16:09
最后发言是6-12那么应该还不算挖坟吧……
我是想说,为什么不用Ruby自带的复数

附加库-数学-complex.rb复数类




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1