import matplotlib.pyplot as plt
公司主营业务:做网站、成都网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出凌河免费做网站回馈大家。
from pylab import mpl
import math
"""
牛顿插值法
插值的函数表为
xi -28.9, -12.2, 4.4, 21.1, 37.8
f(xi) 2.2, 3.9, 6.6, 10.3, 15.4
"""
x=[-28.9,-12.2,4.4,21.1,37.8]
y=[2.2,3.9,6.6,10.3,15.4]
"""计算4次差商的值"""
def Four_time_difference_quotient(x, y):
i = 0 # i记录计算差商的次数
quotient = [0, 0, 0, 0, 0,]
while i 4:
j = 4
while j i:
if i == 0:
quotient[j]=((y[j]-y[j-1])/(x[j]-x[j-1]))
else:
quotient[j] = (quotient[j]-quotient[j-1])/(x[j]-x[j-1-i])
j -= 1
i += 1
return quotient;
def function(data):
return x[0]+parameters[1]*(data-0.4)+parameters[2]*(data-0.4)*(data-0.55)+\
parameters[3]*(data-0.4)*(data-0.55)*(data-0.65)\
+parameters[4]*(data-0.4)*(data-0.55)*(data-0.80)
"""计算插值多项式的值和相应的误差"""
def calculate_data(x,parameters):
returnData=[];
for data in x:
returnData.append(function(data))
return returnData
"""画函数的图像
newData为曲线拟合后的曲线
"""
def draw(newData):
plt.scatter(x,y,label="离散数据",color="red")
plt.plot(x,newData,label="牛顿插值拟合曲线",color="black")
plt.scatter(0.596,function(0.596),label="预测函数点",color="blue")
plt.title("牛顿插值法")
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
plt.legend(loc="upper left")
plt.show()
parameters=Four_time_difference_quotient(x, y)
yuanzu=calculate_data(x,parameters)
draw(yuanzu)
#includeiostream.h
#includemath.h
#includeconio.h
const int N=200;
//带入原函数后所得的值
double f(float x)
{
return (x*x*x-1.8*x*x+0.15*x+0.65);
}
//带入一阶导函数后所得的值
double f1(double x)
{
return (3*x*x-3.6*x+0.15);
}
//牛顿迭代函数
double F(double x)
{
double x1;
x1=x-1.0*f(x)/f1(x);
return (x1);
}
void main()
{
double x0,D_value,x1,y[4];
int k=0,count=0;
for(;;)
{
if(count==3)break;
cout"输入初始值:";
cinx0;
do
{
k++;
x1=F(x0);
D_value=fabs(x1-x0);
x0=x1;
}
while((D_value0.000005)(k=N));
for(int j=0,flag=0;jcount;j++)
{
if(fabs(y[j]-x1)0.000005)
{ flag=1;
cout"该数值附近的根已经求出,请重新换近似值"endl;
break;
}
}
if(flag==1)
continue;
else
{
cout"方程的一个根:"x1","" 迭代次数为:"kendl;
y[count]=x1;
count++;
}
//else
//cout"计算失败!"endl;
}
}
//你的程序其实没问题,牛顿迭代法本身循环一次只能找到一个答案,只要再建一个循环控制使
//用迭代法的次数和判断根的个数就行。我又加了一个判断是否有重复的根的循环。
//希望能对你有所帮助。
令f(x)=2sin(x+π/3)-x,牛顿法求解f(x)=0,过程为:
f'(x)=2cos(x+π/3)-1,任取初值x₀,令x₁=x₀-f(x₀)/f'(x₀)
然后迭代执行:x₀=x₁,x₁=x₀-f(x₀)/f'(x₀),直到|x₁-x₀|=10⁻⁸,x₁即为所求
C语言代码如下:
#includestdio.h
#includemath.h
#define PI 3.141592653589793
int main() {
double x0 = PI; // 初值任取
double x1 = x0-(2*sin(x0+PI/3)-x0)/(2*cos(x0+PI/3)-1);
while (fabs(x1 - x0) 1e-8) {
x0 = x1;
x1 = x0-(2*sin(x0+PI/3)-x0)/(2*cos(x0+PI/3)-1);
}
printf("%.15f\n", x1);
return 0;
}
运行结果如图:
python代码如下:
import math
x0 = math.pi # 初值任取
x1 = x0-(2*math.sin(x0+math.pi/3)-x0)/(2*math.cos(x0+math.pi/3)-1)
while abs(x1-x0) 1e-8:
x0 = x1
x1 = x0-(2*math.sin(x0+math.pi/3)-x0)/(2*math.cos(x0+math.pi/3)-1)
print(x1)
运行结果为:
与C语言结果一致~
import math
def sqrt(x):
y = x
while abs(y * y - x) 1e-6:
y = (y + x / y) / 2
return y
print(sqrt(5))
print(math.sqrt(5))