求解x的等式,(1 + x)^ 4 = 34.5 。我对您使用的数学库感兴趣。
等式是多次简单(1 + x)^ 4 = 34.5
谢谢
答案 0 :(得分:5)
这取决于你所说的“解决”。
如果你的意思是“找到满足该机器浮点精度极限的方程式的双x值”,那么Luiscencio的方法就可以了。
如果通过求解你的意思是“找到形式'x ='的等式,使得x满足给定的等式”(AKA“代数求解”),那么C和C ++都没有可以提供帮助的库。正如Carl所说,你要么必须手工完成,要么使用 Mathematica 或类似的符号数学包进行操作。
如果您的意思不同于其中任何一种,请再次询问更多细节。
答案 1 :(得分:5)
对于更复杂的多项式,您需要更强大的解决方案,但这可能足以完成您的作业。
此算法使用Newton's Method并使用Ruby编写。您可以使用wolfram|alpha验证派生和答案是否正确。
def f(x,a,b,c)
return x*(x+a)**b-c
end
def df(x,a,b,c)
return (x+a)**b+b*x*(x+a)**(b-1)
end
def newton(a,b,c)
xn=0 #initial seed for Newton's method
while true
xn2=xn-f(xn,a,b,c)/df(xn,a,b,c) #Newton's method
print "f(%.5f)=%.5f\n"%[xn,f(xn,a,b,c)]
break if (xn2*10000).to_i==(xn*10000).to_i #set desired precision here
xn=xn2
end
print "root is %.5f"%[xn2]
end
newton(1,4,34.5)
这会产生:
f(0.00000)=-34.50000
f(34.50000)=54793902.65625
f(27.44093)=17954483.09402
f(21.79391)=5883122.74717
f(17.27661)=1927672.51373
f(13.66318)=631598.66717
f(10.77301)=206926.07160
f(8.46171)=67782.26596
f(6.61400)=22194.34671
f(5.13819)=7259.61867
f(3.96214)=2367.67791
f(3.03097)=765.73665
f(2.30728)=241.54928
f(1.77466)=70.68568
f(1.43951)=16.48341
f(1.30101)=1.97186
f(1.27945)=0.04145
f(1.27897)=0.00002
root is 1.27897
答案 2 :(得分:4)
我假设这个问题已经有了很大的改变,因为其他人的回答,因为解决方案是一个微不足道的重新排列等式:
x = 34.5 ^(1/4) - 1
代码:
double x = pow( 34.5, 1.0/4.0 ) - 1 ;
答案 3 :(得分:3)
你的意思是数字解决? 我会将C运行时与“math.h”一起使用,因为Newton–Raphson很容易实现。实际上,您应该说明要求,例如可接受的误差幅度,性能等......然后缩小库选择范围。
答案 4 :(得分:2)
在C语言中解决类似的问题并不会与手工解决它有太大的不同;使用更适合做符号数学的系统(Mathematica?)可能更容易。最近询问了similar question。
答案 5 :(得分:2)
正如其他人所说,你的问题不太清楚。有两种方法可以通过编程方式求解方程式:
第一类方法是numerical analysis的主题。
为称为Computer Algebra Systems(CAS)的软件开发了第二类方法。为此目的,至少有一个C ++库,GiNaC。
此外,作为Carl Norum mentioned,最近询问了similar question,其他CAS库在答案中被引用。
答案 6 :(得分:1)
这是为了更简单的功能。它也有多个种子,以确保我们找到所有的根。
# solve (x+a)^b=c
def f(x,a,b,c)
return (x+a)**b-c
end
def df(x,a,b,c)
return b*(x+a)**(b-1)
end
def newton(a,b,c)
roots=[]
for seed in [-100000, -100, -1,1,100, 100000] # set initial guesses here
print "\n with seed %d\n"%[seed]
root=newton_root(seed,a,b,c)
if root and not roots.include?(root)
roots << root
end
end
return roots
end
def newton_root(xn,a,b,c)
while true
if (df(xn,a,b,c)).abs<0.000001 # give up with this seed if derivative is too low
print " gave up on this seed\n"
return nil
end
xn2=xn-f(xn,a,b,c)/df(xn,a,b,c)
# print " f(%.5f)=%.5f\n"%[xn,f(xn,a,b,c), xn2]
if (xn2*10000).to_i==(xn*10000).to_i # set precision here
rounded_xn=(xn2*10000).to_i/10000.0
print " found root %0.5f\n"%[rounded_xn]
return rounded_xn
else
xn=xn2
end
end
end
print newton(1,4,34.5).inspect
这会产生:
with seed -100000
found root -3.42350
with seed -100
found root -3.42350
with seed -1
gave up on this seed
with seed 1
found root 1.42350
with seed 100
found root 1.42350
with seed 100000
found root 1.42350
[ - 3.4235,1.4235]
答案 7 :(得分:1)
x1 = 34.5 ^(1/4) - 1
x2 = -34.5 ^(1/4) - 1
// #include&lt; math.h&gt;
double x1 = sqrt(sqrt(34.5)) - 1;
double x2 = -sqrt(sqrt(34.5)) - 1;
答案 8 :(得分:1)
(1 + x)^ 4 = 34.5
(1 + x)^ 2 = sqrt(34.5)= +/- 5.87367
1 + x = sqrt(sqrt(34.5))= +/- 2.42357
x = 1.423557 和 x = -3.42357
验证强>
(1 + 1.423557)^ 4 = 34.4995(已检查)
(1 + -3.42357)^ 4 = 34.500(已检查)