第一段直接代值求解,第二段是使用符号变量先解方程再代值,两段程序的结果不一样是为什么
#SLSQP初始方程
import numpy as np
import matplotlib.pyplot as plt
from sympy import symbols,Eq, solve
c=51.7
b3=53.3
p73,p63,p53,p43,p33,p23,p13,p03=symbols('p73,p63,p53,p43,p33,p23,p13,p03')
eq31=Eq(b3**7*p73+b3**6*p63+b3**5*p53+b3**4*p43+b3**3*p33+b3**2*p23+b3*p13+p03,4.183093765255762)
eq32=Eq(7*b3**6*p73+6*b3**5*p63+5*b3**4*p53+4*b3**3*p43+3*b3**2*p33+2*b3*p23+p13,-7.430619007209316e-06)
eq33=Eq(42*b3**5*p73+30*b3**4*p63+20*b3**3*p53+12*b3**2*p43+6*b3*p33+2*p23,-0.018253934168342312)
eq34=Eq(210*b3**4*p73+120*b3**3*p63+60*b3**2*p53+24*b3*p43+6*p33,1.35924437927315e-07)
eq35=Eq(c**7*p73+c**6*p63+c**5*p53+c**4*p43+c**3*p33+c**2*p23+c*p13+p03,4.16)
eq36=Eq(7*c**6*p73+6*c**5*p63+5*c**4*p53+4*c**3*p43+3*c**2*p33+2*c*p23+p13,0.029)
eq37=Eq(42*c**5*p73+30*c**4*p63+20*c**3*p53+12*c**2*p43+6*c*p33+2*p23,-0.018)
eq38=Eq(210*c**4*p73+120*c**3*p63+60*c**2*p53+24*c*p43+6*p33,0.0001)
solution2 = solve([eq31,eq32,eq33,eq34,eq35,eq36,eq37,eq38], (p73,p63,p53,p43,p33,p23,p13,p03))
p73_=solution2[p73]
p63_=solution2[p63]
p53_=solution2[p53]
p43_=solution2[p43]
p33_=solution2[p33]
p23_=solution2[p23]
p13_=solution2[p13]
p03_=solution2[p03]
x=symbols('x')
def f13(x):
return p73_*(x**7)+p63_*(x**6)+p53_*(x**5)+p43_*(x**4)+p33_*(x**3)+p23_*(x**2)+p13_*x+p03_
x3 = np.linspace(51.7,53.3,2500)
y3 = f13(x3)
plt.plot(x3, y3, 'r-', label='Fast rising section')
plt.xlabel("angle")
plt.ylabel("L")
plt.title("L curve")
plt.legend()
plt.show()
print(f13(51.7),f13(53.3))
print(type(f13(51.7)))
#SLSQP初始方程
import numpy as np
import matplotlib.pyplot as plt
from sympy import symbols,Eq, solve,lambdify
b3=53.3
p73,p63,p53,p43,p33,p23,p13,p03,c,h,v,a,j=symbols('p73,p63,p53,p43,p33,p23,p13,p03,c,h,v,a,j')
eq31=Eq(b3**7*p73+b3**6*p63+b3**5*p53+b3**4*p43+b3**3*p33+b3**2*p23+b3*p13+p03,4.183093765255762)
eq32=Eq(7*b3**6*p73+6*b3**5*p63+5*b3**4*p53+4*b3**3*p43+3*b3**2*p33+2*b3*p23+p13,-7.430619007209316e-06)
eq33=Eq(42*b3**5*p73+30*b3**4*p63+20*b3**3*p53+12*b3**2*p43+6*b3*p33+2*p23,-0.018253934168342312)
eq34=Eq(210*b3**4*p73+120*b3**3*p63+60*b3**2*p53+24*b3*p43+6*p33,1.35924437927315e-07)
eq35=Eq(c**7*p73+c**6*p63+c**5*p53+c**4*p43+c**3*p33+c**2*p23+c*p13+p03,h)
eq36=Eq(7*c**6*p73+6*c**5*p63+5*c**4*p53+4*c**3*p43+3*c**2*p33+2*c*p23+p13,v)
eq37=Eq(42*c**5*p73+30*c**4*p63+20*c**3*p53+12*c**2*p43+6*c*p33+2*p23,a)
eq38=Eq(210*c**4*p73+120*c**3*p63+60*c**2*p53+24*c*p43+6*p33,j)
solution2 = solve([eq31,eq32,eq33,eq34,eq35,eq36,eq37,eq38], (p73,p63,p53,p43,p33,p23,p13,p03))
p73_=solution2[p73]
p63_=solution2[p63]
p53_=solution2[p53]
p43_=solution2[p43]
p33_=solution2[p33]
p23_=solution2[p23]
p13_=solution2[p13]
p03_=solution2[p03]
x=symbols('x')
def f13(x):
return p73_*(x**7)+p63_*(x**6)+p53_*(x**5)+p43_*(x**4)+p33_*(x**3)+p23_*(x**2)+p13_*x+p03_
# 给符号变量赋值
c_val = 51.7
h_val = 4.16
v_val = 0.029
a_val = -0.018
j_val = 0.0001
# 给符号变量赋值并定义新函数
f13_new = f13(x).subs([(c, c_val), (h, h_val), (v, v_val), (a, a_val), (j, j_val)])
f = lambdify(x, f13_new)
#shengcheng
x3 = np.linspace(51.7,53.3,2500)
y3 = f(x3)
plt.plot(x3, y3, 'r-', label='Fast rising section')
plt.xlabel("angle")
plt.ylabel("L")
plt.title("L curve")
plt.legend()
plt.show()
print(f(51.7),f(53.3))
print(type(f(51.7)))
两段代码的结果不同的原因在于计算的方式不同。
在第一段代码中,您直接将符号变量替换为具体的数值,并计算了函数的结果。这种方法会直接将符号表达式替换为数值计算,不考虑方程求解的过程。因此,结果可能会受到数值计算的精度和舍入误差的影响。
而在第二段代码中,您先定义了一个包含方程约束的符号表达式,并使用solve函数求解方程的解。然后,您通过lambdify函数将符号表达式转换为可以接受数值输入的函数。这样做可以更准确地求解方程,并按照给定的数值进行计算。因此,结果更接近符号表达式的精确解。
因此,当涉及到复杂的方程求解或需要更准确的结果时,使用第二种方法更可靠。而在第一种方法中,结果可能会受到数值计算精度的影响。
首先要注意的是,你的电脑不是什么超级计算机,他的运算结果可能因为部分限制而无法得出较为准确的结果,由于计算机浮点数运算的限制,仍可能存在数值误差。
sympy库在解符号方程时可能存在数值精度问题,导致结果不准确。如果需要更准确的数值解,可以考虑使用数值计算库如NumPy或SciPy中的优化函数来解方程。
问题点:
①第一段直接代值求解,第二段是使用符号变量先解方程再代值,两段程序的结果不一样
②第二段代码的‘给符号变量赋值’,这个数值怎么来的,这个对结果影响挺大的,c_val会不会赋值错了?这是个疑点
分析思路: 直接代值求解会在计算过程中损失精度, 计算环节越多损失越多.
解决办法: 我们使用numpy.float64数据类型,并将精度设置为30位。这使得我们能够进行高精度计算,而且在输出时也可以保持更高的精度。
import numpy as np
# 设置精度为30位
np.set_printoptions(precision=30)
1结果.
以下内容,基本对应于线性代数教材(同济大学版)的第三章,大家可结合教材回顾讨论
问题的原因是,直接代入数值进行求解和先将方程转化为符号变量再进行求解是两种不同的求解方式,因此得到的结果有可能不一样。
具体地说,使用sympy库中的符号变量进行求解时,得到的是一个符号表达式,而不是一个具体的数值。示例代码中使用的是diff()函数求导,它返回的是一个表示导数的符号表达式。因此,如果直接代入数值进行计算,就无法得到正确的结果。
要解决这个问题,可以使用evalf()函数将符号表达式转换为数值进行计算。示例代码中使用了evalf()函数对符号表达式进行数值求解,并且通过float进行类型转换,然后才能利用numpy进行数值计算。
如果要处理的是数组形式的数据,可以使用循环来完成。示例代码中使用了一个循环,依次对每个数组元素进行数值计算,并将结果存储在一个列表中。最后,将列表转换为numpy数组即可得到最终的结果。
总结起来,问题的解决方案如下:
以上就是解决这个问题的具体步骤和代码示例。如果还有其他问题,可以进一步进行讨论。
python-3.x Sympy求解函数给出了不正确的解决方案/不符合参数
可以参考下
https://www.saoniuhuo.com/question/detail-2566988.html
https://blog.csdn.net/jjjbbbyyyu/article/details/130252626
在第一段程序中,直接代值求解,由于输入的值是精确的数字,所以求解的结果也是精确的。
而在第二段程序中,使用符号变量解方程,解出的结果是包含小数点的符号形式,虽然可以代入具体的数值进行计算,但是存在精度误差,即解出的数值结果可能与实际值存在微小的偏差。
可能是浮点计算误差导致的
采用chatgpt:
sympy库在解符号方程时,可能存在数值精度的问题,导致结果不准确。这可能是由于符号计算的复杂性和数值计算的近似性之间的差异导致的。
在第一段程序中,直接代入数值求解方程,这种方法可以得到数值解,但不是精确解。结果可能受到数值舍入误差的影响,因此与精确解略有差异。
而在第二段程序中,先使用符号变量解方程,然后再代入数值进行计算。这种方法更接近精确解,因为符号计算在处理方程时可以保留更多的精度。然后,通过lambdify函数将符号表达式转换为可进行数值计算的函数。但即使如此,由于计算机浮点数运算的限制,仍可能存在数值误差。
综上所述,符号计算库sympy在解符号方程时可能存在数值精度问题,结果可能不完全准确。如果需要更准确的数值解,可以考虑使用数值计算库如NumPy或SciPy中的优化函数来解方程。
第二段程序使用了符号变量先解方程再代值,而第一段程序则直接对方程进行代值求解。
在第一段程序中,通过解方程组 solve([eq31,eq32,eq33,eq34,eq35,eq36,eq37,eq38], (p73,p63,p53,p43,p33,p23,p13,p03))
得到方程组的解,并将解赋值给相应的变量。然后,通过定义函数 f13(x)
并调用 f13(51.7)
和 f13(53.3)
来计算在给定的角度下函数的值。
而在第二段程序中,同样解了方程组,并将解赋值给相应的变量。然后,通过使用 lambdify
函数将符号变量转化为可调用的函数,并给符号变量赋值。通过定义新函数 f(x)
并调用 f(51.7)
和 f(53.3)
来计算在给定的角度下函数的值。
结果不一致的原因可能是由于符号计算和数值计算的精度问题。符号计算(第一段程序)提供了更高的精度,而数值计算(第二段程序)可能会受到浮点数计算误差的影响。因此,结果有轻微偏差是正常的。
回答部分参考、引用ChatGpt以便为您提供更准确的答案:
两段程序的结果不一致可能是因为使用了不同的求解方法。
第一段程序直接代入数值求解方程,采用符号计算库sympy的solve函数,得到了符号变量p73、p63、p53、p43、p33、p23、p13、p03的解。然后定义了函数f13(x),将解代入得到的表达式,最后通过matplotlib库绘制了曲线图。结果可能是符号计算的近似值。
第二段程序先定义了符号变量,然后使用sympy库中的solve函数求解方程得到符号变量的解。接下来,使用lambdify函数将解代入表达式,并将表达式转换为可调用的函数f(x)。最后,将数值x代入函数f(x),通过matplotlib库绘制了曲线图。
两种方法得到的结果可能存在微小的差异,这是由于符号计算和数值计算之间的近似误差导致的。符号计算库在求解方程时可能进行了一些近似计算,而数值计算则对解进行了数值近似。因此,两种方法得到的结果可能略有不同。
要确保准确性,建议您检查方程的输入、约束条件和数值计算的精度设置。另外,还可以尝试使用其他数值计算方法或库来验证结果的一致性。
在Python中使用sympy库解符号方程时,第一种方法直接代值求解和第二种方法使用符号变量先解方程再代值两种方法输出的结果可能不一样,这是因为两种方法的工作原理不同。
第一种方法 直接代值求解是将方程中的符号变量替换为给定的数值,然后通过求解得到数值解。这种方法适用于只需要得到数值解的情况,但无法得到符号解或需要进一步分析方程的情况。
第二种方法 使用符号变量先解方程再代值是先通过符号运算求解方程,得到符号解,然后再将符号解代入方程中得到数值解。这种方法可以得到方程的通解和特解,并且可以在需要进一步分析方程时提供更多的信息。
因此,如果使用第一种方法直接代值求解和第二种方法使用符号变量先解方程再代值两种方法输出的结果不同,可能是因为两种方法所得到的解不同。如果需要进一步分析方程或得到更多的信息,第二种方法可能更适合使用。如果只需要得到数值解,则第一种方法更快更简单。
如何有帮助请点个采纳,谢谢
引用gpt 回答 有帮助的话 采纳一下
原因在于第一次直接代入数字求解,而第二次是先用符号变量构建方程组求通解,再代入数字求特解。
直接代值会损失符号表达式中变量之间的关系,可能导致误差累积。
而通过符号方法求通解,可以保留变量间的关系,再代入数字求特解,可以获得更准确的结果。
具体来看:
第一段代码中,先代入c=51.7等数字,构建了一个特定的数值方程组求解。
第二段代码中,使用了符号变量构建了一个通用的方程组表达式,求得了通解。然后再代入特定数字求特解。
通解保留了变量间的关系,求数值解更稳定和准确。
这也是通常建议先用符号方法求通解,再代入数字求特解的原因。数值方法容易造成误差累积。
所以两段代码的结果不一样,是因为求解方法的不同造成的。要获得更准确可靠的结果,通常优先考虑符号方法求通解再代值。