题目
一个穷人到富人那里去借钱,原以为富人不愿意,哪知富人一口答应了下来,
但提出了如下条件:
- 在30天中,富人第一天借给穷人1万元,第二天借给2万,以后每天所借的钱数都比上一天的多一万;
- 但 借钱第一天,穷人还1分钱,第二天还2分钱,以后每天所还的钱数都是上一天的两倍。
- 30天后互不相欠,
穷人听后觉得挺划算,本想定下来,但又想到富人是个吝啬出了名的,怕上当,所以很为难。
分析是否应该借钱,并绘图表示看是否存在相交点,看规定多少天划算
import numpy as np
import matplotlib.pyplot as plt
def arithmetic_sequence_sum(begin,end,n):
sum=(begin+end)*n/2
return sum
def proportional_sequence_sum(begin,q,n):
sum=(begin*(1-q**n))/(1-q)
return sum
#验证求和是否正确
#print(proportional_sequence_sum(1,2,30))
#print(arithmetic_sequence_sum(1,30,30))
#借钱是一个等差数列,1开始,30结束,元素为30个
borrows=np.linspace(1,30,num=30)
#还钱是一个等比数列,从1(2^0)开始,到2^29次方结束,注意单位是分
repayments=np.logspace(0,29,num=30,base=2)
#记录每一天的借钱总数
borrows_sum=[0]
#记录每一天的还钱总数
repayments_sum=[0]
for borrow in borrows:
sum=borrows_sum[-1]+borrow
borrows_sum.append(sum)
for repayment in repayments:
sum=(repayments_sum[-1]+repayment*0.01)#转换单位
repayments_sum.append(sum)
borrows_sum=np.array(borrows_sum)
repayments_sum=np.array(repayments_sum)
#可视化分析
fig,ax=plt.subplots()
#后面的数据太大,我们用前16天的数据就可以
x_values=np.arange(1,16)
ax.scatter(x_values,borrows_sum[1:16],label='borrow')
ax.scatter(x_values,repayments_sum[1:16],label='repay')
ax.set_title("Is the rich kind to the poor?",fontsize=16)
ax.set_xlabel("day",fontsize=14)
ax.set_ylabel("money/rmb",fontsize=14)
#显示所有刻度
ax.set_xticks((range(1,17)))
ax.legend()
plt.show()
#利用numpy where计算亏钱的时间
diff=borrows_sum-repayments_sum
text=np.where(diff<0)
print(f"从{text[0][0]}天开始亏钱")
这是一个离散的问题,我们考虑画出散点图,从图中可以看出,从14天开始亏本
总结
学习到numpy如何生成等差等比数列
如何设置刻度
使用np.where函数传递表达式选择符合要求的数组
np.where(condition, [True_value], [False_value])
condition可以是表达式,也可以是布尔数组