我试图在Tensorflow中找到以下4次多项式方程的根:
k1 = 339.749
k2 = -31.988
k3 = 48.275
k4 = -7.201
r = k1 * x + k2 * x**2 + k3 * x**3 + k4 * x**4其中r是一个给定的张量,我需要为r的每个元素找到根。具体来说,我需要一个张量,其中每个元素都是解的实部,其中由张量r的对应元素定义的方程中最小的实部。
既然有一个四次多项式方程的公式,我希望对这个问题有一个计算效率很高的解,但我找不到。
发布于 2022-11-17 07:19:16
只要方程是连续的,你就可以用牛顿-拉夫森方法找到任何方程的根。首先,随机选择一个起点(这个点不能是函数梯度为零的点),然后可以使用
x_new = x - f(x)/f_prime(x)其中f(x)计算你的方程,而f_prime(x)在x点上计算你的方程的梯度。
可以使用f_prime(x)构建tensorflow.GradientTape()
下面是一个完整的工作示例,
import tensorflow as tf
import numpy as np
# Your equation
def f(x):
k1 = 339.749
k2 = -31.988
k3 = 48.275
k4 = -7.201
r = k1 * x + k2 * x**2 + k3 * x**3 + k4 * x**4
return r
# Function to calculate the gradient of your equation at point x
def f_prime(x):
with tf.GradientTape() as tape:
y = f(x)
dy_dx = tape.gradient(y, x)
m = dy_dx.numpy()
return m
# Function to find second approximation to x
def update(x):
x_new = x - f(x)/f_prime(x)
return tf.Variable(x_new)
x = tf.Variable(2, dtype='float32') # Randomly choose a starting point
epochs = 100 # Number of iterations
for i in range(epochs):
x = update(x)
print(x.numpy())计算出的根将是与您选择的起始点最近的根。尝试一个不同的数字,比如200,你就会得到不同的结果。
你可以设定一个更大的时代数来得到一个更精确的解。如果你没有得到f(x)=0的点,这是因为你的起点离解很远,所以你需要设置一个更大的时代数。
利用不同的函数和不同的起点,更好地理解牛顿-拉夫森方法,寻找连续方程的解。如果您在理解此方法时遇到问题,这可能会有所帮助。
https://stackoverflow.com/questions/74470394
复制相似问题