火石玻璃、冕牌玻璃

光学玻璃作为光学仪器最主要的部件,其性能参数直接影响到镜子的成像质量. 光学玻璃最早按照氧化铅含量划分为冕牌玻璃和火石玻璃,低于3%的为冕牌玻璃,高于3%的为火石玻璃,后来随着玻璃种类的增多改用折射率(refractive index)和色散系数(dispersion)划分,冕牌玻璃折射率通常小于1.6,色散系数(也称阿贝数,数值越大,色散越小)大于50,火石玻璃则相反。

       冕牌玻璃(crown glass 缩写中最后一个字母为K):这个名字很容易让人误解为一个品牌,其实只是一种制作工艺,因此也有人翻译成皇冠玻璃:是先把玻璃液吹成一个皇冠状或者空心球状,再放在在一个快速旋转的平板中心重新加热,利用离心力将其展开铺平,形成一块直径1.5米左右的玻璃圆板,较为平薄的边缘就切成合适的形状做窗玻璃,中间的圆形凸起就是透镜的雏形了,不过也有人并不介意图像的扭曲,并称之为Bullseye windows (牛眼玻璃窗)。这种生产方法在1320年左右就被法国鲁昂附近的玻璃工匠发展成熟,但是作为商业秘密没有公布,于是一水之隔的英国人整整进口了三百年的窗玻璃,直到1628年伦敦才出现同样的工艺。

        火石玻璃(Flint glass 也译作燧石玻璃,缩写以F结尾):在十七世纪中叶,英格兰东南部白垩纪沉积层中的火石矿被广泛用于制造铅玻璃(火石含铅量通常为4%-60%),故名。但是铅玻璃在生产和处理过程中会对环境造成污染,现在一般用二氧化钛、氧化锆等替代。

        由于德国蔡司公司的玻璃型号齐全,性能稳定,一般沿用其命名标准。K代表冕牌,F代表燧石,Z为重,B代表硼,Ba代表钡,L代表镧 ,P代表磷,N代表无铅, 比如双筒望远镜中广泛采用的BK7棱镜,其所用的材料是硼硅酸盐玻璃(borosilicate 德语为 borkron)中的第7号;而视场更亮的BaK4棱镜则采用第4号轻钡冕玻璃(light barium crown ,德语中是baritleichtkron)。其他种类还包括氟冕(FK)、轻冕(QK)、重磷冕 (ZPK)、重冕(ZK)、特冕(TK)、轻火石(QF)、重火石(ZF)、重钡火石 (ZBaF)、冕火石(KF)、特种火石(TF)等等。

        在以色散系数为横坐标,折射率为纵坐标的阿贝图中分布如下:


还有一个不得不提的材料是Fluorite——萤石,其实就是氟化钙晶体(这种物质在我们的牙齿中就有,对防治龋齿有重要作用),它的色散非常(阿

贝数为95.3),这使得它非常适合用作光学材料,萤石矿分布比较广泛,但可满足光学精度要求的很少,加上其可加工性与化学稳定性较差(微溶于水),因而非常昂贵。 除了光学玻璃,常见的还有一些复合镜片,将几片光学性能不同的镜片胶合在一起使用以克服单一种类的缺陷:比如尼康公司的超低色散镜片ED(Extra-low Dispersion)、佳能公司的UD(Ultra Dispersion)、腾龙公司的LD(Low Dispersion)、适马公司的SLD、美能达公司开发的AD等等,也许是方便炒作吧,我不知道更多的技术细节,就不展开了。

=============================================================================

冕牌玻璃是由包含大约10%的碱石灰硅酸盐的氧化钾,它有着较低的折射率(大约是1.52)和低色散(阿贝数大约是60)。 除了具体以材料命名

的冕牌玻璃之外,其他的光学玻璃也有与被称为冕牌玻璃性质相似的产品。通常,只要阿贝数在50-85之间的玻璃,像是肖特硼硅酸盐玻璃:BK7

,是一种很常见,用在精密透镜上的冕牌玻璃。硼硅酸盐玻璃包含大约10%的含硼氧化物,有良好的光学和机械特性,并且对化工和环境的伤害具

有抵抗性。用于冕牌玻璃的其它添加物还有氧化锌、五氧化二磷、 氧化钡、和萤石。 燧石玻璃的凹透镜经常与冕牌玻璃的凸透镜组合成消色差透

镜。两种玻璃的色散作用会相互的补偿(抵消)以消除色差,并且和单镜有着相同的焦距。 火石玻璃用二氧化硅、氧化钾(K2O)和氧化铅(PbO

)等原料熔炼而成,其特点是折射率高,色散大。由于含铅,玻璃的比重也大,手掂时感到沉重,火石玻璃中所含的铅越多,折射率越高,而且比

重也越大,例如,有含铅达92%,折射率高达2,比重达到8的玻璃,它几乎和钢铁一样比重,遗憾的是,这种含铅量太高的火石都带有黄色,这就

限制了它在某些领域(例如制作光学仪器元件)中应用。   火石玻璃的缺点是硬度低,甚至用小刀也可以划出伤痕,并且不稳定,容易发霉或被酸

和酸的蒸气及其它化学药剂腐蚀,同时火石玻璃的价格比冕牌要贵得多。   火石玻璃主要用于光学仪器工业,磨制各种透镜和棱镜,在玉石行业中

,火石玻璃的高折射率和大色散非常有用,用它磨成的假玉石不仅特别光亮,而且因色散大会从玉石内反射出五颜六色的彩色闪光。此外,用火石

玻璃制造工艺品也是非常合适的

=========================================================

综上 ,我的PW法求解程序中,对玻璃库中的玻璃类型判别依据是

1、先看玻璃名字,若其中含有K,则认为是冕牌,若其中含有F,则认为是火石

2、若名字中既有K又有F,则看其阿贝数,大于50的为冕牌玻璃,小于50的为火石玻璃

  • 12
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一、最少花费路线问题 为了解决这个问题,我们可以使用贪心算法,每次选择距离当前位置最近的未被访问过的景点,直到所有景点都被访问过。 首先,我们需要将所有景点的经纬度坐标存储在一个字典中,然后计算出每两个景点之间的距离。这可以使用经纬度计算公式(如haversine公式)来实现。 接着,我们可以使用一个列表来记录已经访问过的景点,以及一个字典来记录每个景点的费用。然后从起点开始,每次找到距离当前位置最近的未被访问过的景点,并将其加入到已访问列表中,并累加所需的费用。 最后,输出旅游路线和总费用即可。 代码示例: ```python import math # 景点经纬度坐标 locations = { '沙湖': (38.487099, 106.155481), '西夏王陵': (38.466320, 106.130647), '贺兰山岩画': (38.496648, 106.297815), '黄沙古渡旅游区': (38.222789, 105.928023), '北武当生态旅游区': (38.973315, 106.316145), '沙坡头': (37.508221, 105.181056), '寺口子': (37.492356, 105.155761), '青铜峡黄河大峡谷': (37.763865, 105.981294), '哈巴胡生态旅游区': (37.686578, 106.251312), '须弥山石窟': (36.031307, 106.201014), '六盘山': (35.550419, 105.694435), '老龙潭': (36.019286, 106.198785), '火石寨': (36.033351, 106.220259) } # 景点之间的距离 distances = {} for source, source_loc in locations.items(): for target, target_loc in locations.items(): if source != target and (target, source) not in distances: lat1, lon1 = source_loc lat2, lon2 = target_loc radius = 6371 # 地球半径,单位为公里 dlat = math.radians(lat2 - lat1) dlon = math.radians(lon2 - lon1) a = math.sin(dlat / 2) * math.sin(dlat / 2) + math.cos(math.radians(lat1)) \ * math.cos(math.radians(lat2)) * math.sin(dlon / 2) * math.sin(dlon / 2) c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) distance = radius * c distances[(source, target)] = distance distances[(target, source)] = distance # 景点费用 costs = { '沙湖': 100, '西夏王陵': 50, '贺兰山岩画': 80, '黄沙古渡旅游区': 60, '北武当生态旅游区': 120, '沙坡头': 40, '寺口子': 50, '青铜峡黄河大峡谷': 100, '哈巴胡生态旅游区': 80, '须弥山石窟': 30, '六盘山': 40, '老龙潭': 50, '火石寨': 30 } # 贪心算法求解 visited = ['银川'] total_cost = 0 while len(visited) < len(locations): best_dist = float('inf') best_place = None for place in locations: if place not in visited: dist = distances[(visited[-1], place)] if dist < best_dist: best_dist = dist best_place = place visited.append(best_place) total_cost += costs[best_place] # 输出结果 print('旅游路线:', ' -> '.join(visited)) print('总费用:', total_cost) ``` 二、最少时间路线问题 为了解决这个问题,我们可以使用动态规划算法。首先,我们需要将所有景点的经纬度坐标存储在一个字典中,然后计算出每两个景点之间的距离。 接着,我们可以使用一个二维的动态规划数组dp[i][j],其中i表示当前访问的景点数量(初始为1),j表示当前在哪个景点(初始为起点)。 动态规划的状态转移方程为:dp[i][j] = min(dp[i-1][k] + distances[(k, j)]),其中k表示上一个访问的景点,distances[(k, j)]表示从k到j的距离。 最终,我们只需要找到dp[10][j]中最小的值,即为最少时间路线所对应的起点。然后从该起点开始,依次按照dp[i][j]的值进行访问即可。 代码示例: ```python # 景点经纬度坐标 locations = { '沙湖': (38.487099, 106.155481), '西夏王陵': (38.466320, 106.130647), '贺兰山岩画': (38.496648, 106.297815), '黄沙古渡旅游区': (38.222789, 105.928023), '北武当生态旅游区': (38.973315, 106.316145), '沙坡头': (37.508221, 105.181056), '寺口子': (37.492356, 105.155761), '青铜峡黄河大峡谷': (37.763865, 105.981294), '哈巴胡生态旅游区': (37.686578, 106.251312), '须弥山石窟': (36.031307, 106.201014), '六盘山': (35.550419, 105.694435), '老龙潭': (36.019286, 106.198785), '火石寨': (36.033351, 106.220259) } # 景点之间的距离 distances = {} for source, source_loc in locations.items(): for target, target_loc in locations.items(): if source != target and (target, source) not in distances: lat1, lon1 = source_loc lat2, lon2 = target_loc radius = 6371 # 地球半径,单位为公里 dlat = math.radians(lat2 - lat1) dlon = math.radians(lon2 - lon1) a = math.sin(dlat / 2) * math.sin(dlat / 2) + math.cos(math.radians(lat1)) \ * math.cos(math.radians(lat2)) * math.sin(dlon / 2) * math.sin(dlon / 2) c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) distance = radius * c distances[(source, target)] = distance # 动态规划求解 dp = [[float('inf')] * len(locations) for _ in range(11)] for j in range(len(locations)): dp[1][j] = 0 for i in range(2, 11): for j in range(len(locations)): for k in range(len(locations)): if k != j: dp[i][j] = min(dp[i][j], dp[i-1][k] + distances[(k, j)]) # 找到最少时间路线的起点 best_start = None best_time = float('inf') for j in range(len(locations)): if dp[10][j] < best_time: best_time = dp[10][j] best_start = j # 输出结果 visited = [] cur_place = best_start for i in range(10, 0, -1): visited.append(cur_place) for j in range(len(locations)): if j != cur_place and dp[i-1][j] + distances[(j, cur_place)] == dp[i][cur_place]: cur_place = j break visited.append(cur_place) visited.reverse() print('旅游路线:', ' -> '.join([list(locations.keys())[i] for i in visited])) print('总时间:', best_time / 60, '小时') ``` 三、最少费用路线问题 为了解决这个问题,我们可以使用深度优先搜索算法。首先,我们需要将所有景点的经纬度坐标存储在一个字典中,然后计算出每两个景点之间的距离。 接着,我们可以使用一个列表来记录已经访问过的景点,以及一个字典来记录每个景点的费用。然后从起点开始,进行深度优先搜索,每次选择距离当前位置最近的未被访问过的景点,并将其加入到已访问列表中,并累加所需的费用。 每次搜索时,我们需要判断当前的费用是否已经超过了限制,如果超过了则回溯。如果所有的景点都被访问过,则更新最优路线和最小费用。 最后,输出最优路线和最小费用即可。 代码示例: ```python # 景点经纬度坐标 locations = { '沙湖': (38.487099, 106.155481), '西夏王陵': (38.466320, 106.130647), '贺兰山岩画': (38.496648, 106.297815), '黄沙古渡旅游区': (38.222789, 105.928023), '北武当生态旅游区': (38.973315, 106.316145), '沙坡头': (37.508221, 105.181056), '寺口子': (37.492356, 105.155761), '青铜峡黄河大峡谷': (37.763865, 105.981294), '哈巴胡生态旅游区': (37.686578, 106.251312), '须弥山石窟': (36.031307, 106.201014), '六盘山': (35.550419, 105.694435), '老龙潭': (36.019286, 106.198785), '火石寨': (36.033351, 106.220259) } # 景点之间的距离 distances = {} for source, source_loc in locations.items(): for target, target_loc in locations.items(): if source != target and (target, source) not in distances: lat1, lon1 = source_loc lat2, lon2 = target_loc radius = 6371 # 地球半径,单位为公里 dlat = math.radians(lat2 - lat1) dlon = math.radians(lon2 - lon1) a = math.sin(dlat / 2) * math.sin(dlat / 2) + math.cos(math.radians(lat1)) \ * math.cos(math.radians(lat2)) * math.sin(dlon / 2) * math.sin(dlon / 2) c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) distance = radius * c distances[(source, target)] = distance # 景点费用 costs = { '沙湖': 100, '西夏王陵': 50, '贺兰山岩画': 80, '黄沙古渡旅游区': 60, '北武当生态旅游区': 120, '沙坡头': 40, '寺口子': 50, '青铜峡黄河大峡谷': 100, '哈巴胡生态旅游区': 80, '须弥山石窟': 30, '六盘山': 40, '老龙潭': 50, '火石寨': 30 } # 深度优先搜索求解 best_route = None min_cost = float('inf') def dfs(cur_place, visited, cur_cost): global best_route, min_cost if len(visited) == len(locations): if cur_cost < min_cost: best_route = visited[:] min_cost = cur_cost return for place in locations: if place not in visited: dist = distances[(cur_place, place)] cost = costs[place] if cur_cost + cost > 2500: continue visited.append(place) dfs(place, visited, cur_cost + cost) visited.pop() dfs('银川', ['银川'], 0) # 输出结果 print('旅游路线:', ' -> '.join(best_route)) print('总费用:', min_cost) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值