求任何多项式函数在 x 处的切线

如何解决求任何多项式函数在 x 处的切线

问题:

我正在寻找一个包罗万象的函数,我可以用它来计算 任何 多项式函数在 x 处的切线。我对使用的语言无动于衷,尽管更喜欢 JavaScript 或 Python!我应该能够以 a + bx + cx^2 + dx^3 ... 等格式传入任何 x 值和系数数组。

示例函数格式:

function findTangent(x,coefficients) {

  // Do differential calculus here.

  return [tangentIntercept,tangentSlope]

}

示例功能测试:

假设我有函数 y = 2 + 7x + 5x^2 + x^3 并且我想在 x = -2 处找到切线.我可以像这样调用这个函数,findTangent(-2,[2,7,5,1]) 并得到一个像这样的返回值,[-2,-1] 代表切线,y = -2 - x

注意事项:

我在 Math Stackexchange 和 Google 搜索中寻找答案,但所有结果都采用数学语法而不是代码。我想要一个程序化的解决方案,我更喜欢循环和 if 语句,而不是有趣的符号和数学术语!

解决方法

好的,经过一天的努力,我想我已经在 J​​avaScript Python 中找到了解决方案!

The JavaScript Solution

function findTangent(x,coefficients) {

  let slope = 0
  let intercept = coefficients[0]

  for (let i = 1; i < coefficients.length; i++) {

    slope += coefficients[i] * i * Math.pow(x,i - 1)
    intercept += coefficients[i] * Math.pow(x,i)

  }

  return [intercept - slope * x,slope]

}

The Python Solution

def find_tangent(x,coefficients):

    slope = 0
    intercept = coefficients[0]

    for i,coefficient in enumerate(coefficients):

        if i != 0:

            slope += coefficient * i * pow(x,i - 1)
            intercept += coefficient * pow(x,i)

    return [intercept - slope * x,slope]

我已经针对 Symbolab Tangent Calculator 测试了结果,它们似乎没问题,但是如果您发现任何错误,请告诉我!此外,我希望看到其他语言的结果因此,如果您有此处未提及的首选语言,请随时发布!

,

由于您询问了其他语言,这里是一个 C 函数,用于计算多项式在某一点的导数(和值)。我推荐的方法可以用于任何语言。

double  pol_eval_d( double x,int deg,const double* c,double* pdp)
{
double  p = c[deg];
double  dp = 0.0;
    for( int d=deg-1; d>=0; --d)
    {   dp = fma( dp,x,p);
        p = fma( p,c[d]);
    }
    *pdp = dp;
    return p;
}

此函数采用 x 值、多项式的次数和系数,并返回多项式在 x 处的值及其在 *pdp 中的导数值。

系数是 c[0](幂 0)、c[1](幂 1)、.. 和 c[deg](幂 deg)。

它调用(C 数学库)函数 fma,为此

fma(x,y,z) = x*y+z,except that it is evaluated with extra precision.

如果你没有这样的函数,你可以用上面的表达式替换调用,虽然你会失去一点准确性。

使用的方法是霍纳的方法。这通常比评估多项式的​​其他方法更快、更准确。

为了解释它是如何工作的,首先考虑我们不想要导数的情况。然后就可以写

double  pol_eval( double x,const double* c)
{
double  p = c[deg];
    for( int d=deg-1; d>=0; --d)
    {   p = fma( p,c[d]);
    }
    return p;
}

如果我们逐步了解二次方程会发生什么,并用它们的数学等价物替换 fma 调用,我们会得到

p = c[2]
p = p*x + c[1]
p = p*x + c[0]

这是我们评估过的

c[0]+x*c[1]+x*x*c[2] 

c[0] + x*(c[1] + x*c[2])

这是霍纳的方法。

为了计算导数,我们对 pol_eval 中的每一项进行微分。最初 p 是一个常数,所以它的导数是 0。然后当我们更新 p 时

p = fma( p,c[d]);

或者用数学术语

p = p*x + c[d];

我们使用乘积规则来区分,所以因为 c[d] 是一个常数

dp = dp*x + p

并注意我们必须在更新 p 之前这样做

,

使用允许符号微分的 Python Sympy

代码

from sympy import Function,Symbol

def polynomial(coeficents,degrees,x):
    '''
        Evaluate polynomial
        
        Example
            coefficients = [1,2,4]
            degrees = [2,1,0]
            
            corresponds to polynomial x^2 + 2*x + 4
    '''
    return sum([coeficents[i]*x**degrees[i] for i in range(len(coeficents))])
         
# Using OP polynomial
coefficients = [1,5,7,2]
degrees = [3,0]
print(polynomial(coefficients,-2))  # Output: 15

# Create symbolic polynomial in x
# Define symbolic variable x
x = Symbol('x')  # symbolic variable x

# Create polynomial in x for OP polynomial
poly = polynomial(coefficients,x)
print(poly)                                  # Output: x**3 + 5*x**2 + 7*x + 2
# Evaluate at x = -2
print(poly.subs(x,-2))                      # Output: 7  (i.e. substitute x for 1 in equation)

####################################################
# Symbolic differentiation of polynomial 'poly'
####################################################
diff_poly = poly.diff(x)
print(diff_poly)                             # Output: 3*x**2 + 10*x + 7 (derivative of polynomial)
# Evaluate derivative at x = -2
print(diff_poly.subs(x,-2))                 # Output: -1   (derivate at x = -1)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res